我有以下代码:
def foo(func, *args, named_arg = None):
return func(*args)
Run Code Online (Sandbox Code Playgroud)
返回SyntaxError:
File "tester3.py", line 3
def foo(func, *args, named_arg = None):
^
Run Code Online (Sandbox Code Playgroud)
这是为什么?是否有可能以某种方式定义一个函数,它接受一个参数(func),然后是args命名参数之前的变量参数列表?如果没有,我的可能性是什么?
catch-all *args参数必须在任何显式参数之后:
def foo(func, named_arg=None, *args):
Run Code Online (Sandbox Code Playgroud)
如果还将catch-all **kwkeywords参数添加到定义中,那么必须在*args参数之后:
def foo(func, named_arg=None, *args, **kw):
Run Code Online (Sandbox Code Playgroud)
混合使用显式关键字参数和catch-all *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,)
Run Code Online (Sandbox Code Playgroud)
这是因为foo()将始终使用任何第二个位置参数named_arg.
在Python 3中,*args参数可以放在关键字参数之前,但这具有新的含义.通常,关键字参数可以在调用签名中指定为位置参数(例如,调用您foo(somefunc, 'argument')已'argument'分配给的函数named_arg).通过在位置参数和命名参数之间放置*args或平滑*,可以排除命名参数用作位置参数; 调用foo(somefunc, 'argument')会引发异常.
| 归档时间: |
|
| 查看次数: |
6340 次 |
| 最近记录: |