**kwargs 在 Python

**kwargs in Python

所以我在 Python 中尝试了 *args 和 **kwargs。但是我得到一个错误,我无法理解原因。

def new(a,b,c):
  print a,b,c

a={'a': 7, 'b': 8, 'c': 9}
b={'1':7, '2':8, '3':9}

new(**a)
new(**b)

new(**a) 打印出预期的结果,即键,7,8,9。 但是, new(**b) 给出了错误:

new(**b)
TypeError: new() got an unexpected keyword argument '1'

谁能解释一下?在这两种情况下,我都将字符串作为参数传递,但是 'a' 有效而 '1' 无效。

原因很简单。当您将字典作为 kwargs 传递给 python 函数时,它会将其解包并使用字典中的键作为变量的名称,并且您可以**仅使用您在中指定的参数名称函数参数列表.

对于字典 data={"key1":val1, "key2":val2, ..., "keyn":valn} 当你在函数调用中进行字典解包时,fun(**data) 等同于做 fun(key1=val1, key2=val2,..., keyn=valn),只要你的函数有参数 key1,这就会成功,...,keyn and/or 接受关键字参数。

所以 new(**b) 的问题在于试图执行 new(1=7,2=8,3=9) 这是无稽之谈,因为该函数只有名为 abc,因此错误。

对于您的第二个示例,请尝试使用列表

b=[7,8,9]
new(*b)

此外,您可能想尝试一下此功能

def test(*argv, **kwarg):
    print "positional arguments", argv
    print "key word arguments", kwarg

比如喜欢

test(1,23,42)
test(w=3,r="buu")
test(1,2,3,q=23,ans=42)
a=[143,56,76]
b={'a': 7, 'b': 8, 'c': 9}
test(*a,**b)

This is related to a similar question,但简而言之,将 **kwargs 传递给方法是一种传递多个 key w 的方法ord arguments 作为字典。

您尝试失败的原因是您的方法 new 定义了 3 个命名参数 - a,b,c 所以如果您传入一个 kwargs 字典,它 必须 这些值作为键。

重要的是要注意,您还可以在方法中 catch kwargs,这样您就可以调用带有数字参数的方法,如下所示:

def foo(**kwargs):
    print kwargs

a={'a': 7, 'b': 8, 'c': 9}
b={'1':7, '2':8, '3':9}

foo(**a)
foo(**b)

给出:

{'a': 7, 'c': 9, 'b': 8}
{'1': 7, '3': 9, '2': 8}