Подтвердить что ты не робот

Python: как работают наборы

У меня есть список объектов, которые я хочу превратить в набор. Мои объекты содержат несколько полей, некоторые из которых o.id и o.area. Я хочу, чтобы два объекта были равны, если эти два поля одинаковы. т.е.: o1==o2 тогда и только тогда, когда o1.area==o2.area and o1.id==o2.id.

Я попытался переписать __eq__ и __cmp__, но я получил ошибку: TypeError: unhashable instance.

Что я должен переписать?

4b9b3361

Ответ 1

Определите метод __hash__ для возврата значимого хэша на основе полей id и area. Например:.

def __hash__(self):
    return hash(self.id) ^ hash(self.area)

Ответ 2

"TypeError: unhashable instance." ошибка, вероятно, связана с определением класса старого типа i.e.:

class A:
  pass

Вместо этого используйте новый стиль:

class A(object):
  pass

Если вы переопределите функцию __cmp__, вы должны переопределить __hash__ для использования вашего объекта в наборах. В другом случае хеш рассматривает все экземпляры объектов как неравные, а функция __cmp__ никогда не будет вызвана.