2009-10-13 19 views
6

Estoy trabajando en una clase de colección para la que quiero crear un método __eq__ para. Está resultando más matizado de lo que pensé que sería y he notado varias complejidades en cuanto a cómo funcionan las clases de colección incorporadas.¿Cuál es un buen ejemplo de un método __eq__ para una clase de colección?

Lo que realmente me ayudaría más es un buen ejemplo. ¿Existen implementaciones puras de Python de un método __eq__ en la biblioteca estándar o en las bibliotecas de terceros?

Respuesta

1

Eche un vistazo a "collections.py". La última versión (desde el control de versiones) implementa un OrderedDict con un __eq__. También hay un __eq__ en sets.py

+0

Gracias. Pensé que las colecciones se implementaron en C ... –

+0

En Python 2.5 y 2.6 es un módulo de extensión C. En 2.7 (desde control de versión) es un módulo de Python que importa deque y defaultdiect del módulo de extensión C _collections. OrderedDict es nuevo en 3.1 y se transfiere a 2.7. –

7

Las piezas son duras. Las partes deben ser simples delegaciones.

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

Lo intenté, pero hay un par de matices aquí. Por ejemplo, lo siguiente compara False: '(1,2,3) == [1,2,3]'. Es por eso que quería un ejemplo: para asegurarme de que sé sobre todos los casos de esquina y otras cosas. –

+0

(1,2,3) no es igual a [1,2,3] porque son tipos diferentes. ¿Qué tipo de reglas de coerción cree que deberían aplicarse? Eso es bastante complejo. Ese es el tipo "más general"? 'tuple (self [i]) == tuple (other [i])' –

+0

No todas las colecciones son indexables, como conjuntos, y no hay garantía de que colecciones iguales tengan sus elementos en el mismo orden. – PaulMcG

Cuestiones relacionadas