私のプログラムのPython 3.1フォークに機能を移植する際に、私は奇妙なバグがありました。`__eq__`を定義する型はハッシュできませんか?
Python 3.xでは、オブジェクトに__eq__
メソッドがある場合、それは自動的に解けません。これは、次の仮説に絞りました。
これは本当ですか?
は、ここではPython 3.1で何が起こるかです:
>>> class O(object):
... def __eq__(self, other):
... return 'whatever'
...
>>> o = O()
>>> d = {o: 0}
Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
d = {o: 0}
TypeError: unhashable type: 'O'
フォローアップの質問は、どのように私は私の個人的な問題を解決するのですか?私はいくつかのオブジェクトを指しているWeakKeyDictionary
を格納しているオブジェクトChangeTracker
を持っていて、過去の特定の時点でそれぞれのpickleダンプの値を与えています。既存のオブジェクトがチェックインされるたびに、変更トラッカーは新しいピクルが古いピクルと同じであるかどうかを示し、その間にオブジェクトが変更されたかどうかを示します。問題は、オブジェクトがライブラリ内にあるかどうかをチェックすることもできません。なぜなら、オブジェクトがハッシュ不能であるという例外を発生させるからです。 (原因は__eq__
の方法です)これを回避するにはどうすればよいですか?
あなたが '__hash__'メソッドを提供するとどうなりますか? – ndim