**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)
这是无稽之谈,因为该函数只有名为 a
、b
和 c
,因此错误。
对于您的第二个示例,请尝试使用列表
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}
所以我在 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)
这是无稽之谈,因为该函数只有名为 a
、b
和 c
,因此错误。
对于您的第二个示例,请尝试使用列表
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}