2013-11-22 36 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