2013-11-22 40 views
2

看看下面这个例子(使用Python 2.7.6):函数参数拆包错误

>>> def func(a, b, c, d): 
    print a, b, c, d 

>>> func(1, c = 3, *(2,), **{'d':4}) 
1 2 3 4 

到这里,这是好的。但是,为什么下面的通话失败了?

>>> func(1, b = 3, *(2,), **{'d':4}) 

Traceback (most recent call last): 
    File "<pyshell#69>", line 1, in <module> 
    func(1, b = 3, *(2,), **{'d':4}) 
TypeError: func() got multiple values for keyword argument 'b' 
+1

你使用的是什么版本的Python?它很重要。 – rdodev

+0

Python 2.7不会引发错误。 – karthikr

+0

我正在使用python 2.7.6 – user3022222

回答

3

它可以与其它函数签名

>>> def func(*args, **kw): 
     print(args, kw) 


>>> func(1, b = 3, *(2,), **{'d':4}) 
(1, 2) {'b': 3, 'd': 4} 

因此,位置参数放在一起,因此可以更好地理解是关键字参数。

使用原始签名,这意味着23将被分配到b,这是无效的。

PS:由于简单的元组解包不提供名称,因此这些值将被视为位置参数。

+0

同样,我觉得这很有趣,但通过golly,我希望人们不要用它来以这样复杂的方式传递参数。我想知道PEP8有没有关于如何传递争论的说法。 – rdodev

+0

@JBernardo你的回答对我来说很合理,但这不是我阅读Python文档的原因。我明白,在函数调用期间,参数按以下顺序处理:位置,名称,* Targ,** Darg。你说(并显示)他们按以下顺序处理:位置,* Targ,命名,** Darg。你有手头的Python文档或PEP描述这种行为? – user3022222

+0

@ user3022222不,我说的是他们最终放在一起,因为'* args'也是位置参数。 – JBernardo