我可以为一个值分配多个关键字参数吗?

时间:2017-05-12 17:23:28

标签: python python-3.x function keyword-argument

我有一个程序,它使用一个带有很多关键字参数的函数,这些函数都默认为None,并且希望有一个比分配每个参数更好的方法。这是函数声明:

def __init__(self, includes=None, main=None,
                   functions=None, classes=None,
                   lambdas=None, variables=None,
                   values=None):

正如你所知,这是相当长的,我希望有像

这样的东西
def __init__(self, includes=main=functions=classes=lambdas=variables=values=None):

更短更容易编写。

有人能回答这个问题吗?这真的很有帮助。

3 个答案:

答案 0 :(得分:3)

你显然不能,这是一个语法错误。

请考虑使用**kwargs,正如@aryamccarthy建议的那样。

您可以检查是否只接受所需名称:

def foo(**kwargs):
  known_args = set(['pizza', 'burger', 'sausage'])
  extra_args = set(kwargs) - known_args
  if extra_args:
    raise ValueError('Unknown argument names: %r' % extra_args)
  # proceed as normal

答案 1 :(得分:2)

我在评论中提到这是你应该更喜欢**kwargs的时候。它是一个字典,可以捕获传递给函数的所有命名参数。以下是您如何使用它:

def __init__(self, **kwargs):
    if includes in kwargs:
        do_something()
    if main in kwargs:
        do_something_else()
    ...

按照您通常使用的方式处理每个参数:

if includes is not None:
    do_something()
if main is not None:
    do_something_else()
...

您所询问的内容在语法上是不可能的(并且类似不存在),但这会实现相同的语义结果。

答案 2 :(得分:0)

您可以将新变量设置为等于None,然后使用:

a = None
def __init__(self, includes=a, main=a, functions=a, classes=a, lambdas=a, variables=a, values=a):

哪会显着缩短它,否则,不可能。