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

4 投票
2 回答
6690 浏览
提问于 2025-04-16 08:09

在方法的定义中,把 **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重新赋值。

撰写回答