У меня была странная ошибка при переносе функции в виджет Python 3.1 моей программы. Я сузил его до следующей гипотезы:
В отличие от Python 2.x, в 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'
Следующий вопрос: как мне решить мою личную проблему? У меня есть объект ChangeTracker
, который хранит WeakKeyDictionary
, который указывает на несколько объектов, давая каждому значение дампа рассола в определенный момент времени в прошлом. Всякий раз, когда проверяется существующий объект, трекер отслеживает, совпадает ли его новый рассол со своим старым, и поэтому указывает, изменился ли этот объект тем временем. Проблема в том, что теперь я не могу даже проверить, находится ли данный объект в библиотеке, потому что он вызывает возбуждение исключения по поводу неотображаемого объекта. (Потому что у него есть метод __eq__
.) Как я могу обойти это?