2012-01-31 4 views
4

설명 할 수없는 이상한 오류가 발생했습니다.dict에 인덱싱 할 때 Python NoneType을 호출 할 수 없습니다

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' 

누군가가 나에게 이것을 설명시겠습니까 :

나는 오류가이 같은 뭔가 더있을 것입니다 예상?

__hash__ = None # Avoid Py3k warning 

따라서이 문제는 UserDict의 구현 인 것이 사실입니다 : @Wooble에 의해 제안

+2

hash (UserDict.UserDict())는 같은 오류를냅니다. 분명히 이것을 수행하는 UserDict 구현에 뭔가가 있습니다. – geoffspear

답변

4

UserDict 구현을 보면, 나는 이것이 참조하십시오. 당신이 정말로 자신의 사전 유형을 사용해야하는 경우

, 나는 frozenset, 예를 들어,의 도움으로 해쉬 객체로 사전 변환, 대안 dict에서 직접 서브 클래스 화해, 자신의 __hash__ 방법을 구현하거나하는 것이 좋습니다 :

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

(해시 키로 UserDict를 래핑하는 경우에도 거의 dict을 사용하는 것이 좋습니다.) – geoffspear

+0

@Wooble 네, 물론 옳습니다. 사전 객체를 키로 사용하는 것이 일반적으로 길은 아닙니다. – jcollado

+0

예, 좋은 생각이 아닙니다. NoneType 오류를 보았을 때 오류 메시지가 의미가 없기 때문에 실제 문제를 찾는 데 몇 분이 걸렸습니다. 그래서 나는 모호한 오류 메시지의 원인을 이해하기를 원했습니다. – talljosh

0

UserDict.UserDict().__hash__None입니다. Wooble의 코멘트와 결합하면 이것이 일어나는 이유를 알 수 있습니다.

관련 문제