Arten, Definition von `__eq__`, sind unhashable?

Hatte ich einen seltsamen Fehler bei der Portierung einer Funktion, um die Python 3.1-Gabel von meinem Programm. Ich verengt Sie sich auf der folgenden Hypothese:

Im Gegensatz zu Python 2.x, in Python 3.x wenn für ein Objekt ein __eq__ Methode ist es automatisch unhashable.

Ist das wahr?

Hier ist, was passiert in 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'

Den follow-up-Frage ist, wie löse ich mein problem? Ich habe ein Objekt ChangeTracker die speichert eine WeakKeyDictionary Punkte, die zu mehreren Objekten, wobei für jede den Wert Ihrer Gurke-dump zu einem bestimmten Zeitpunkt in der Vergangenheit. Wenn ein vorhandenes Objekt aktiviert ist, ist die Veränderung tracker sagt, ob seine neue Gurke ist identisch mit seinen alten, deshalb zu sagen, ob das Objekt in der Zwischenzeit geändert. Problem ist, jetzt kann ich auch nicht überprüfen, ob das angegebene Objekt in der Bibliothek, weil es macht es eine Ausnahme auslösen über das Objekt, unhashable. (Ursache es hat eine __eq__ Methode.) Wie kann ich dies umgehen?

Was passiert, wenn man einen __hash__ Methode?

InformationsquelleAutor Ram Rachum | 2009-10-22

Schreibe einen Kommentar