2009-10-13 3 views
6

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

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

ответ

1

Посмотрите на "collections.py". Последняя версия (от контроля версий) реализует OrderedDict с __eq__. Там также есть __eq__ в sets.py

+0

Спасибо. Я думал, что коллекции были реализованы в C ... –

+0

В Python 2.5 и 2.6 это модуль расширения C. В версии 2.7 (от контроля версий) это модуль Python, который импортирует deque и defaultdiect из модуля _collection расширения C. OrderedDict является новым в версии 3.1 и содержит 2,7. –

7

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

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))) 
+0

Я пробовал это, но здесь есть несколько нюансов. Например, следующие сравнения: False: '(1,2,3) == [1,2,3]'. Вот почему я хотел привести пример: убедиться, что я знаю обо всех угловых случаях и еще много чего. –

+0

(1,2,3) не равно [1,2,3], потому что они разные. Какие типы правил принуждения, по вашему мнению, должны применяться? Это довольно сложно. Это «более общий» тип? 'tuple (self [i]) == tuple (other [i])' –

+0

Не все коллекции индексируются - например, наборы - и нет никакой гарантии, что одинаковые коллекции будут иметь свои позиции в том же порядке. – PaulMcG

Смежные вопросы