Ich hatte einen seltsamen Fehler beim Portieren einer Funktion auf den Python 3.1-Zweig meines Programms. Ich habe es auf folgende Hypothese eingegrenzt:
Im Gegensatz zu Python 2.x ist ein Objekt in Python 3.x __eq__
automatisch nicht verwertbar, wenn es über eine Methode verfügt.
Ist das wahr?
Folgendes 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'
Die folgende Frage lautet: Wie löse ich mein persönliches Problem? Ich habe ein Objekt, ChangeTracker
das ein Objekt speichert WeakKeyDictionary
, das auf mehrere Objekte verweist und für jedes den Wert ihres Pickle Dump zu einem bestimmten Zeitpunkt in der Vergangenheit angibt. Jedes Mal, wenn ein vorhandenes Objekt eingecheckt wird, gibt der Änderungs-Tracker an, ob die neue Gurke mit der alten identisch ist, und gibt daher an, ob sich das Objekt in der Zwischenzeit geändert hat. Das Problem ist, dass ich jetzt nicht einmal überprüfen kann, ob sich das angegebene Objekt in der Bibliothek befindet, da dadurch eine Ausnahme ausgelöst wird, dass das Objekt nicht verwertbar ist. (Weil es eine __eq__
Methode gibt.) Wie kann ich das umgehen?
__hash__
Methode angeben?