函数参数名称中的别名(双重命名)

2024-09-30 18:28:08 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python中,函数的参数是否可以有双重名称? 我的意思是变量名的简短和完整形式。在

我会尽量说清楚的。熟悉Autodesk Maya的每个人都知道 约束的函数。它有一些标志,您可以使用其名称的短格式或长格式:

maintainOffset(mo), weight(w), layer(l) and so on..

因此,您可以使用不同的参数名称调用此函数,但结果相同:

cmds.parentConstraint(driverObj, drivenObj, maintainOffset=True, weight=1.0,..)
cmds.parentConstraint(driverObj, drivenObj, maintainOffset=True, w=1.0,..)
cmds.parentConstraint(driverObj, drivenObj, mo=True, weight=1.0,..)
cmds.parentConstraint(driverObj, drivenObj, mo=True, w=True,..)

如何在Python中实现这种类型的行为2.7.x?我正在积极使用文档,但仍然找不到答案。在

除此之外,我还为各种类型的约束定义了4个函数:

^{pr2}$

连接列表:

cLst = produceConnectionList(tNodesA, tNodesB)

和一些包装器的函数:

def batchConnect(type = "parentConstraint", ???):
    cLst = produceConnectionList(tNodesA, tNodesB)
    if type is "parentConstraint": doParentConstraint(cLst, ???)
    if type is "orientConstraint": doOrientConstraint(cLst, ???)
    if type is "pointConstraint": doPointConstraint(cLst, ???)
    if type is "scaleConstraint": doScaleConstraint(cLst, ???)

但是我不知道如何在这些函数和包装器之间传递值,因为尽管它们有相同数量的参数,但参数的名称和类型稍有不同。在

另外,我想在调用包装器时有机会使用简短和完整的标志名称:

batchConnect("pointConstraint", mo=False, offset=(0,0,0), weight=1)
batchConnect("pointConstraint", maintainOffset=False, o=(0,0,0), w=1)

必须这样做。在

batchConnect("pointConstraint")

如果没有参数,则必须使用默认值调用doPointConstraint()。在

batchConnect()

如果不指定类型和参数,则默认情况下必须使用这些默认值调用doParentConstraint()


Tags: 函数名称true参数iftypemoweight
2条回答
def myExample(**kwargs):
    if kwargs.get("width") and kwargs.get("w"):
        cmds.error("same flag used two times")
    else:
        myWidth = kwargs.get("width") or kwargs.get("w") or "nothing"
    print(myWidth)

myExample(width=200)

在我的一些剧本里我已经习惯了

编辑-

如果必须多次执行此操作,则创建自定义类可能很容易:

^{pr2}$

如果我正确地理解了您的目标,那么最简单的方法是使用**kwargs“magic”和{a1},例如:

def demo(maintain_offset=None, **config):
    if maintain_offset is None:  # if not supplied by 'real name'
        maintain_offset = config.get('mo', 'baz')  # check alias, fall back to default
    print maintain_offset

(注意遵守style guide。使用中:

^{pr2}$

如果不熟悉此语法,请参见What does ** (double star) and * (star) do for parameters?


对于更通用的方法,可以使用decorator语法用一组别名包装函数:

import functools

def alias(aliases):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(**kwargs):
            for name, alias in aliases.items():
                if name not in kwargs and alias in kwargs:
                    kwargs[name] = kwargs[alias]
            return func(**kwargs)
        return wrapper
    return decorator

使用中:

>>> @alias({'maintain_offset': 'mo'})
def demo(maintain_offset='baz', **kwargs):
    print maintain_offset


>>> demo(maintain_offset="foo")
foo
>>> demo(mo="bar")
bar
>>> demo()
baz

相关问题 更多 >