2012-01-10 13 views
20

Supongamos que las instancias de mi ClassA terminarán en una estructura de datos y sabemos que sorted() será invocado. Es el código de otra persona que llamará a sorted(), por lo que no puedo especificar una función de clasificación, pero puedo implementar los métodos apropiados en ClassA.¿Es seguro implementar __lt__ para una clase que será ordenada?

Me parece que

def __lt__(self, other): 

es suficiente y que no es necesario poner en práctica las otras cinco o más métodos (qt, eq, le, ge, ne).

¿Es esto suficiente?

Respuesta

27

PEP 8 recomienda en contra de esta práctica. También se recomienda no hacerlo porque se trata de un estilo de programación frágil (no robusto frente a modificaciones de código de menor importancia):

En su lugar, considere el uso del decorador functools.total_ordering clase para hacer el trabajo:

@total_ordering 
class Student: 
    def __eq__(self, other): 
     return ((self.lastname.lower(), self.firstname.lower()) == 
       (other.lastname.lower(), other.firstname.lower())) 
    def __lt__(self, other): 
     return ((self.lastname.lower(), self.firstname.lower()) < 
       (other.lastname.lower(), other.firstname.lower())) 
+0

Gracias, esto es perfecto! –

+1

El tipo de Python * está * documentado como el que usa únicamente '__lt __()', solo para el registro, pero el futuro está a prueba. ¡No sabía sobre este! – kindall

+1

@kindall ¿Lo obtuviste de mi guía de cómo ordenar? Proporcione un enlace para que pueda editar los documentos y aclarar que no se recomienda confiar en \ _ \ _ lt \ _ \ _. –

Cuestiones relacionadas