Python: как работают наборы - PullRequest
       11

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

25 голосов
/ 28 марта 2010

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

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

Что мне переписать?

Ответы [ 2 ]

38 голосов
/ 28 марта 2010

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

def __hash__(self):
    return hash(self.id) ^ hash(self.area)
9 голосов
/ 28 марта 2010

"Ошибка типа: неустранимый экземпляр." ошибка, вероятно, из-за определения класса старого стиля, т. е.

class A:
  pass

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

class A(object):
  pass

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

...