有没有办法在函数调用期间将键值对添加到kwargs中?
def f(**kwargs):
print(kwargs)
# ...
pre_defined_kwargs = {'a': 1, 'b': 2}
f(**pre_defined_kwargs, c=3)
甚至改变现有的论点?
f(**pre_defined_kwargs, b=3) # replaces the earlier b=2
这两个例子不起作用,因为它们会引起错误
>>> f(**pre_defined_kwargs, c=3)
SyntaxError: invalid syntax
指着论点之间的逗号
对于Python版本<3.5,您需要最后放置**kwargs
变量关键字参数:
f(c=3, **pre_defined_kwargs)
见Calls expression syntax;在所有形式的语法中,"**" expression
规则放在最后。换句话说,在**expression
语法之后使用任何东西都是语法错误。
如果要使用新值更新字典,可以使用dict()
callable;如果密钥也是有效的Python标识符(以字母或下划线开头,并且只包含字母,数字和下划线),它可以创建现有字典的副本并更新密钥:
f(c=3, **dict(pre_defined_kwargs, b=42))
在这里,b=42
为'b'
键设置了一个新值。当然,也可以使用相同的语法来添加键。
您不能在**expression
映射中明确地使用相同的密钥;这将提高一个TypeError
。再次,从已经链接的文档:
如果语法
**expression
出现在函数调用中,则expression
必须求值为映射,其内容被视为附加关键字参数。如果关键字出现在expression
和显式关键字参数中,则会引发TypeError
异常。
演示:
>>> def f(**kwargs):
... print(kwargs)
...
>>> pre_defined_kwargs = {'a': 1, 'b': 2}
>>> f(c=3, **pre_defined_kwargs)
{'a': 1, 'c': 3, 'b': 2}
>>> dict(pre_defined_kwargs, b=42)
{'a': 1, 'b': 42}
>>> f(c=3, **dict(pre_defined_kwargs, b=42))
{'a': 1, 'c': 3, 'b': 42}
从Python 3.5开始已经解除了这个限制(感谢PEP-448 -- Additional Unpacking Generalizations;你现在可以自由地混合参数类型的顺序并在调用中使用多个**mapping
引用(使用不同的映射)。关键字在所有应用的参数中仍然必须是唯一的;你仍然无法“覆盖”多次出现的参数。
>>> f(c=3, **pre_defined_kwargs)
{'c': 3, 'a': 1, 'b': 2}