** Python中的kwargs

时间:2016-10-06 02:12:01

标签: python-2.7 kwargs

所以我在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'没有按'吨

3 个答案:

答案 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)这是一个废话,因为该函数只有名为ab和{{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}