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