2012-01-31 54 views
4

我遇到了這個奇怪的錯誤,我無法解釋。當索引到字典時Python無類型不可調用

Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import UserDict 
>>> a = UserDict.UserDict() 
>>> b = {} 
>>> b[a] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not callable 

我明白這應該是一個錯誤。我不明白它爲什麼說'NoneType' object is not callable。據我所知,我不會調用導致錯誤的行中的任何內容。

我預計錯誤會是這樣的東西更多:

>>> b[b] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'dict' 

可有人請我解釋一下我發瘋之前?在UserDict實施

+2

'hash(UserDict.UserDict())'產生相同的錯誤;顯然在UserDict的實現中有一些是這樣做的。 – geoffspear 2012-01-31 11:30:35

回答

4

希望通過@Wooble的建議,我看到:

__hash__ = None # Avoid Py3k warning 

因此這是真的,這個問題是因爲UserDict實施。

如果你真的需要使用自己的字典類的話,建議直接從dict子類,並實現自己的__hash__方法,或者變換字典成一個哈希的對象的幫助下,例如,frozenset

>>> a = UserDict.UserDict() 
>>> b[frozenset(a.items())] 
+0

(請注意,嘗試使用字典,即使用UserDict包裝它,作爲散列鍵也幾乎是個好主意) – geoffspear 2012-01-31 11:38:34

+0

@Wooble是的,你當然是對的。將字典對象用作關鍵字通常不是一種方法。 – jcollado 2012-01-31 11:46:52

+0

是的,我意識到這是一個壞主意。只是當我看到NoneType錯誤時,花了我幾分鐘的時間才發現真正的問題,因爲錯誤信息沒有意義。所以我想了解這個模糊的錯誤信息的原因。 – talljosh 2012-01-31 12:28:13

0

UserDict.UserDict().__hash__None。結合Wooble的評論,你會明白爲什麼會發生這種情況