2011-03-22 42 views
3

所以,我有一些代碼,其中包含一本字典,我做了一些字典驗證。驗證規則基本上是字典可能包含'to'鍵或'to []'鍵。它包含了哪一個,我需要的值返回,所以我可以檢查長度對在字典中的另一個密鑰的長度。的Python dict.get()行爲*默認*不

其實我已經找到了一個更好的辦法來解決眼前的問題,但通過這個工作,我在Python 2.7.1跨一個奇怪的行爲來,這意味着一個dict.get()不工作方式我想,所以我正在尋找一些澄清之前,我潛水到C實施的字典,我並不特別急於做:)

簡短的摘要版本是,它似乎如果你通過默認值將獲得(),巨蟒試圖評估該默認即使第一個參數是字典中的一個有效的密鑰。

下面是一個例子:

>>> toparm = 'to' 
>>> toarrparm = 'to[]' 
>>> d = {toparm: 'foo'} 
>>> d.get(toarrparm, [d[toparm]]) 
['foo'] 
>>> d = {toarrparm: ['foo', 'bar']} 
>>> d.get(toarrparm, [d[toparm]]) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
KeyError: 'to' 
>>> d 
{'to[]': ['foo', 'bar']} 
>>> toarrparm 
'to[]' 
>>> sys.version 
'2.7.1 (r271:86882M, Nov 30 2010, 10:35:34) \n[GCC 4.2.1 (Apple Inc. build 5664)]' 
>>> d['to[]'] = ['foo', 'bar', 'baz'] 
>>> d 
{'to[]': ['foo', 'bar', 'baz']} 
>>> d.get(toarrparm) 
['foo', 'bar', 'baz'] 
>>> d.get(toarrparm, [d[toparm]]) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
KeyError: 'to' 
>>> d 
{'to[]': ['foo', 'bar', 'baz']} 
>>> d['to'] = 'foo' 
>>> d.get(toarrparm, [d[toparm]]) 
['foo', 'bar', 'baz'] 
>>> 

如果這種行爲是舊聞,有人可以解釋爲什麼那會是什麼?我是不是應該總是問爲嘛我覺得第一?如果我真的不知道哪一個會在那裏呢?回落試試/除了?我錯過了其他的東西嗎?

回答

9

函數或函數的參數總是在調用該函數之前進行評估。如果你不想要這個,那麼使用一個哨兵對象而不是表達式作爲默認值。

+0

D'哦!當然,我知道這個規則,但我想我只是處於一種糟糕的思維模式。太靠近問題==愚蠢的錯誤。感謝一堆提醒! – jonesy 2011-03-22 13:51:28