如果存在同名的位置参数,为什么kwargs中的键被丢弃?

Aka*_*all 1 python kwargs

我刚遇到这种令我惊讶的行为:

def my_func(a=4, **kwargs):
    print kwargs
Run Code Online (Sandbox Code Playgroud)

演示:

>>> my_func(a=5, b=6)
{'b': 6}  # I was expecting {'a' : 4, 'b' : 6}
          # Maybe {'a' : 5, 'b' : 6}
Run Code Online (Sandbox Code Playgroud)

另外,如果我得到,我不会感到惊讶:

SyntaxError: keyword argument repeated

如在

>>> my_func(a=4, a=5)
  File "<stdin>", line 1
SyntaxError: keyword argument repeated
Run Code Online (Sandbox Code Playgroud)

要么 TypeError: my_func() got multiple values for keyword argument 'a'

如在

>>> my_func(a=4, **{'a' : 5, 'b' : 6})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: my_func() got multiple values for keyword argument 'a'
Run Code Online (Sandbox Code Playgroud)

删除关键字'a'后python遵循哪些规则?

也许我错过了一些明显的或关键的术语,但我无法通过搜索找到解决方案.

dan*_*ano 5

a没有被删除,它只是没有被包含在内**kwargs,因为你在函数定义中明确定义了它.所以如果我编辑你原来的例子:

def my_func(a=4, **kwargs):
    print kwargs
    print a
Run Code Online (Sandbox Code Playgroud)

然后测试一下:

>>> my_func(a=5, b=7)
{'b': 7}
5
Run Code Online (Sandbox Code Playgroud)

**kwargs参数用于收集函数调用中给出的可选关键字参数,这些参数未明确包含在函数定义中.由于您包含a=4在定义中my_func,因此不会包含在内**kwargs.

这在Python文档中提到(强调我的):

当存在**name形式的最终形式参数时,它会接收一个字典(请参阅映射类型 - dict),其中包含除了与形式参数相对应的所有关键字参数.