在函数调用期间将参数添加到 kwargs 中?

Add a parameter into kwargs during function call?

有没有办法在函数调用期间将键值对添加到 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

指向参数之间的逗号

>>> f(c=3, **pre_defined_kwargs)
{'c': 3, 'a': 1, 'b': 2}

对于 Python 版本 < 3.5,您需要放置 **kwargs 变量关键字参数 last:

f(c=3, **pre_defined_kwargs)

Calls expression syntax;在所有形式的语法中,"**" expression 规则被放置在 last。换句话说,在 **expression 语法之后使用任何内容都是语法错误。

如果你想用新值更新字典,你可以使用dict() callable;它可以创建现有字典 更新键的副本,前提是这些键也是有效的 Python 标识符(以字母或下划线开头,并且只包含字母,数字和下划线):

f(c=3, **dict(pre_defined_kwargs, b=42))

这里 b=42'b' 键设置了一个 new 值。当然,同样的语法也可用于添加键。

您不能在 **expression 映射中和显式使用相同的键;那会引发 TypeError。同样,来自已链接的文档:

If the syntax **expression appears in the function call, expression must evaluate to a mapping, the contents of which are treated as additional keyword arguments. In the case of a keyword appearing in both expression and as an explicit keyword argument, a TypeError exception is raised.

演示:

>>> 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 引用(使用不同的映射。关键字在所有应用的参数中仍然必须是唯一的;您仍然不能 'override' 出现多次的参数。