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

2024-04-20 08:58:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

指向参数之间的逗号


Tags: thedef错误prekwargs例子键值print
2条回答
>>> f(c=3, **pre_defined_kwargs)
{'c': 3, 'a': 1, 'b': 2}

对于Python版本<;3.5,需要将**kwargs变量关键字参数放在最后一个

f(c=3, **pre_defined_kwargs)

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

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

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

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

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

相关问题 更多 >