Esto se debe a que __lt__()
y los métodos de comparación relacionados se usan comúnmente de forma indirecta en los ordenamientos de lista y demás. A veces, el algoritmo elegirá probar de otra manera o elegir un ganador predeterminado. Plantear una excepción se saldría de la clasificación a menos que se capture, mientras que NotImplemented
no se levanta y se puede usar en pruebas adicionales.
http://jcalderone.livejournal.com/32837.html
Para resumir que enlace:.
"NotImplemented
señales al tiempo de ejecución que debería pedir a alguien más para satisfacer la operación en la expresión a == b
, si a.__eq__(b)
devuelve NotImplemented
, luego trata de Python b.__eq__(a)
. Si b
sabe lo suficiente como para devolver True
o False
, la expresión puede tener éxito. Si no lo hace, el tiempo de ejecución volverá al comportamiento incorporado (que se basa en iden tity para ==
y !=
). "
Tendría cuidado al usarlo, ya que este enlace señala cerca del final del documento. –
Cuando el intérprete de Python verifica si 'a .__ eq __ (b)' devolvió NotImplemented, ¿no podría fácilmente capturar NotImplementedError en su lugar (y llamar a 'b .__ eq __ (a)' o lo que sea luego)? – Veky
@ Veky. Levantar una excepción probablemente tenga una sobrecarga más alta. Cualquier sobrecarga en una operación de ordenamiento se verá ampliada por el tamaño de la lista, por lo que incluso si la diferencia fuera muy pequeña, todavía tendría sentido encontrar una implementación más rápida. Tampoco querrá romper sus bucles y volver a entrar en ellos, lo que requeriría una implementación try/catch. – SpliFF