所以我在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)
新的(** a)按预期打印结果,即键7,8,9。 但是,新的(** b)给出了错误:
new(**b)
TypeError: new() got an unexpected keyword argument '1'
有人可以解释一下吗?在这两种情况下,我都将字符串作为参数传递,但是' a'作品和' 1'没有按'吨
答案 0 :(得分:1)
原因很简单。当您将字典作为 kwargs传递给python函数时,它将解压缩并使用字典中的键作为变量的名称,并且您只能使用您在函数参数列表中指定的参数名称强>
答案 1 :(得分:0)
对于字典data={"key1":val1, "key2":val2, ..., "keyn":valn}
,当您在函数调用中进行字典解包时,fun(**data)
等同于执行fun(key1=val1, key2=val2,..., keyn=valn)
,只要您的函数具有参数key1,这将成功。 ..,keyn和/或接受关键字参数。
因此new(**b)
的问题是尝试执行new(1=7,2=8,3=9)
这是一个废话,因为该函数只有名为a
,b
和{{1}的参数因此错误。
对于您的,您的第二个示例尝试使用list而不是
c
此外,您可能想要使用此功能
b=[7,8,9]
new(*b)
就像例如
def test(*argv, **kwarg):
print "positional arguments", argv
print "key word arguments", kwarg
答案 2 :(得分:0)
This is related to a similar question,但简短地将**kwargs
传递给方法是一种传递一些 k ey w ord arg uments as a dictionary。
您的尝试失败的原因是您的方法new定义了3个命名参数 - a,b,c
,因此如果您传入kwargs
字典,必须将这些值作为键。
请注意,您还可以在方法中捕获 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}