try pass custom catch and python exception

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ón a == b , si a.__eq__(b) devuelve NotImplemented , Python intenta b.__eq__(a) . Si b sabe lo suficiente para devuelve True o False , 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):

NotImplemented

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

excepción NotImplementedError

[...] 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.