catch-all*args
参数必须在任何显式参数之后:
def foo(func, named_arg=None, *args):
如果您还将 catch-all**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'
给一样named_arg
)。通过在位置参数和命名参数之间放置*args
或放置一个平原*
,您可以将命名参数排除在位置参数之外;调用foo(somefunc, 'argument')
会引发异常。