在方法签名中结合 **kwargs 和关键字参数的用法
在方法的定义中,把 **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'
看起来好像没什么用,但也许有人发现了什么好用的技巧...
2 个回答
15
在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'}
(注意,我虽然改变了参数的顺序,但没有改变print
的顺序。)
在Python 2中,你不能在可变参数后面放一个关键字参数,但在Python 3中可以这样做,这样那个参数就只能通过关键字来传递。
另外,要小心将可变对象作为默认参数(放置可变对象作为默认参数)。
9
你在给kw赋值两次。
在这个调用中 f(5, 'a', 'b', 'c', kw=['abc'], kw2='def')
,arg是5,kw是'a',*args则是('b','c'),然后你又试图给kw重新赋值。