Что является хорошим примером метода __eq__ для класса коллекции?

Я работаю над классом коллекции, для которого я хочу создать __eq__метод. Оказалось, что это более нюанс, чем я думал, и я заметил несколько сложностей, касающихся работы встроенных классов коллекций.

Что действительно помогло бы мне больше всего, это хороший пример. Существуют ли чистые реализации __eq__метода на Python в стандартной библиотеке или в сторонних библиотеках?

13.10.2009 13:26:53
2 ОТВЕТА
РЕШЕНИЕ

Взгляните на "collection.py". Последняя версия (из управления версиями) реализует OrderedDict с __eq__. Есть также __eq__ в sets.py

1
14.10.2009 21:33:03
В Python 2.5 и 2.6 это модуль расширения C. В 2.7 (из контроля версий) это модуль Python, который импортирует deque и defaultdiect из модуля расширения C _collections. OrderedDict является новым в 3.1 и перенесен в 2.7.
Andrew Dalke 14.10.2009 23:08:02

Части тяжелые. Запчасти должны быть простой делегирования.

def __eq__( self, other ):
   if len(self) != len(other):
       # Can we continue?  If so, what rule applies?  Pad shorter?  Truncate longer?
   else:
       return all( self[i] == other[i] for i in range(len(self)) )
7
13.10.2009 13:31:03
Я попробовал это, но здесь есть пара нюансов. Например, следующее сравнение Ложные: (1,2,3) == [1,2,3]. Вот почему я хотел пример: чтобы я знал обо всех угловых делах и еще много чего.
Jason Baker 13.10.2009 13:53:08
(1,2,3) не равно [1,2,3], потому что они разных типов. Как вы думаете, какие правила принуждения должны применяться? Это довольно сложно. Это «более общий» тип? tuple(self[i]) == tuple(other[i])
S.Lott 13.10.2009 14:15:08
Не все коллекции индексируются - например, наборы - и нет никакой гарантии, что одинаковые коллекции будут иметь свои элементы в одинаковом порядке.
PaulMcG 13.10.2009 15:50:42
@ S.Lott - ты прав. Ответ, как написано, однако, сделал бы кортеж и список равными, так как он не проверяет тип.
Jason Baker 13.10.2009 17:33:42
@Paul McGuire: я не уверен, как вы можете сравнить набор с кортежем или списком. Это даже не имеет смысла для меня. Вы должны будете предоставить более подробное объяснение того, что это может означать.
S.Lott 13.10.2009 17:47:39