在函数调用期间将参数添加到 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' 出现多次的参数。
有没有办法在函数调用期间将键值对添加到 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 bothexpression
and as an explicit keyword argument, aTypeError
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' 出现多次的参数。