У меня была странная ошибка при переносе функции на развилку 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__
.) Как я могу обойти это?