2009-05-18 7 views

Respuesta

184

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 !=). "

+4

Tendría cuidado al usarlo, ya que este enlace señala cerca del final del documento. –

+8

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

+11

@ 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

9

Una razón es el rendimiento. En una situación como las comparaciones enriquecidas, donde podría estar haciendo muchas operaciones en poco tiempo, configurar y manejar muchas excepciones podría llevar mucho más tiempo que simplemente devolver un valor de NotImplemented.

-4

Hay funciones que aumentan las excepciones y las funciones que no, return NotImplemented podrían ser para este último .... realmente depende del programador/diseño. Es por eso que ambos están ahí para su uso.

+14

Revisa el Zen de Python ('>>> import this'). Preste especial atención a la línea 13: "Debería haber una, y preferiblemente solo una, forma obvia de hacerlo". Python no es Ruby, Perl o cualquier otro idioma en el que haya docenas de formas igualmente válidas de hacer algo. La respuesta nunca es que depende del gusto del programador. – ArtOfWarfare

18

Porque tienen diferentes casos de uso.

citando el docs (Python 3.6):

NotImplemented

deben ser devueltos por los métodos especiales binarios (por ejemplo __eq__(), __lt__(), __add__(), __rsub__(), etc.) para indicar que la operación no está implementada con respecto al otro tipo

exception NotImplementedError

[...] En definidos por el usuario de base clases, métodos abstractos deben plantear esta excepción cuando requieren las clases derivadas para anular el método, o mientras que la clase se siendo desarrollado para indicar que la implementación real aún necesita para ser agregado.

Consulte los enlaces para obtener más detalles.

Cuestiones relacionadas