我有以下代码:
def foo(func, *args, named_arg = None):
return func(*args)
返回一个SyntaxError
:
File "tester3.py", line 3
def foo(func, *args, named_arg = None):
^
这是为什么呢?是否有可能以这种方式定义一个函数,它接受一个参数 (func
),然后在命名参数之前是一个变量参数列表 args
?如果不是,我的可能性是什么?
最佳答案
包罗万象的 *args
参数必须出现在任何显式参数之后:
def foo(func, named_arg=None, *args):
如果您还将包罗万象的 **kw
关键字参数添加到定义中,则该参数必须位于 *args
之后参数:
def foo(func, named_arg=None, *args, **kw):
混合显式关键字参数和包罗万象的 *args
参数确实会导致意外行为;您不能同时使用任意位置参数和显式命名您列出的关键字参数。
func
之外的任何额外位置首先用于 named_arg
,它也可以作为位置参数:
>>> def foo(func, named_arg = None, *args):
... print func, named_arg, args
...
>>> foo(1, 2)
1 2 ()
>>> foo(1, named_arg=2)
1 2 ()
>>> foo(1, 3, named_arg=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got multiple values for keyword argument 'named_arg'
>>> foo(1, 2, 3)
1 2 (3,)
这是因为 foo()
的任何第二个位置参数将始终用于named_arg
。
在 Python 3 中,*args
参数可以放在关键字参数之前,但这具有新的含义。通常,关键字参数可以在调用签名中指定为位置参数(例如,将函数调用为 foo(somefunc, 'argument')
会将 'argument'
分配给 命名参数
)。通过将 *args
或普通的 *
放在位置参数和命名参数之间,您可以排除命名参数被用作位置;调用 foo(somefunc, 'argument')
会引发异常。
关于python - 在 python 中使用命名/未命名和变量参数调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13821877/