在方法签名中使用**kwargs和关键字参数的组合

exp*_*des 4 python

是否可以在方法签名中组合**kwargs和关键字参数?

>>> def f(arg, kw=[123], *args, **kwargs): 
...  print arg
...  print kw
...  print args
...  print kwargs
... 
>>> f(5, 'a', 'b', 'c', kw=['abc'], kw2='def')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got multiple values for keyword argument 'kw'
Run Code Online (Sandbox Code Playgroud)

它似乎毫无用处,但也许有人找到了一个很好的技巧......

rob*_*ert 12

在Python 3中,您可以使用仅限关键字的参数(PEP 3102).有了这些,你的功能将如下所示:

>>> def f(arg, *args, kw=[123], **kwargs): 
...  print(arg)
...  print(kw)
...  print(args)
...  print(kwargs)
>>> f(5, 'a', 'b', 'c', kw=['abc'], kw2='def')
5
('a', 'b', 'c')
['abc']
{'kw2': 'def'}
Run Code Online (Sandbox Code Playgroud)

(注意,虽然我改变了参数的顺序,但我没有改变prints 的顺序.)

在Python 2中,你不能在varargs参数之后有一个关键字参数,但是在Python 3中你可以,并且它使该参数仅用于关键字.

另外,要小心将可变对象作为默认参数.


Fal*_*rri 9

你要两次分配kw.

在这个调用中f(5, 'a', 'b', 'c', kw=['abc'], kw2='def'),arg = 5,kw ='a',*args =('b','c'),然后你试图再次分配kw.