python - pass - ¿Por qué devolver NotImplemented en lugar de elevar NotImplementedError?
try and catch exception python (4)
Python tiene un singleton llamado NotImplemented
.
¿Por qué alguien querría devolver NotImplemented
lugar de NotImplementedError
excepción NotImplementedError
? ¿No hará que sea más difícil encontrar errores, como el código que ejecuta métodos no válidos?
Esto se debe a que __lt__()
y los métodos de comparación relacionados se usan comúnmente de manera indirecta en los tipos de listas y similares. A veces, el algoritmo elegirá probar de otra manera o elegir un ganador predeterminado. El hecho de generar una excepción se rompería de esta manera a menos que se NotImplemented
, mientras que NotImplemented
no se NotImplemented
y se puede usar en pruebas adicionales.
http://jcalderone.livejournal.com/32837.html
Para resumir ese enlace:
"
NotImplemented
señala al tiempo de ejecución que debe pedirle a otra persona que satisfaga la operación. En la expresióna == b
, sia.__eq__(b)
devuelveNotImplemented
, Python intentab.__eq__(a)
. Sib
sabe lo suficiente para devuelveTrue
oFalse
, entonces la expresión puede tener éxito. Si no lo hace, entonces el tiempo de ejecución retrocederá al comportamiento incorporado (que se basa en la identidad para==
y!=
) ".
Hay funciones que return NotImplemented
excepciones y funciones que no lo hacen, por lo que return NotImplemented
podría ser para este último ... realmente depende del programador / diseño. Es por eso que ambos están allí para su uso.
Una de las razones es el rendimiento. En una situación como las ricas comparaciones, en las que podría realizar muchas operaciones en poco tiempo, configurar y manejar muchas excepciones podría llevar mucho más tiempo que simplemente devolver un valor No NotImplemented
.
Porque tienen diferentes casos de uso.
Citando los documentos (Python 3.6):
debe ser devuelto por los métodos especiales binarios (por ejemplo,
__eq__()
,__lt__()
,__add__()
,__rsub__()
, etc.) para indicar que la operación no se implementó con respecto al otro tipo
[...] En las clases base definidas por el usuario, los métodos abstractos deben generar esta excepción cuando requieren que las clases derivadas anulen el método, o mientras se desarrolla la clase para indicar que aún es necesario agregar la implementación real.
Vea los enlaces para más detalles.