Por qué devolver NotImplemented en lugar de elevar NotImplementedError


Python tiene un singleton llamado NotImplemented.

¿Por qué alguien querría volver NotImplemented en lugar de elevar la NotImplementedError ¿excepción? ¿No hará que sea más difícil encontrar errores, como el código que ejecuta métodos no válidos?

Author: Paolo, 2009-05-18

4 answers

Es porque __lt__() y los métodos de comparación relacionados son muy comúnmente usados indirectamente en ordenamientos de lista y tales. A veces, el algoritmo elegirá probar de otra manera o elegir un ganador predeterminado. Levantar una excepción se rompería a menos que se atrapara, mientras que NotImplemented no se levanta y se puede usar en otras pruebas.

Http://jcalderone.livejournal.com/32837.html

Para resumir ese enlace:

"NotImplemented señales al tiempo de ejecución que debería pedirle a alguien más 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 devolver True o False, entonces la expresión puede tener éxito. Si no lo hace, entonces el tiempo de ejecución volverá al comportamiento incorporado (que se basa en la identidad para == y !=)."

 206
Author: SpliFF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-31 07:55:09

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 ejecuta con respecto al otro tipo

Error de no ejecución de excepción

[...] En base definida por el usuario clases, métodos abstractos deben plantear esto excepción cuando require derived classes to override the method, or while the class is se está desarrollando para indicar que la implementación real aún necesita por añadir.

Vea los enlaces para más detalles.

 36
Author: Paolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-15 20:24:04

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

 8
Author: RichieHindle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-17 16:50:59

Hay funciones que generan Excepciones y funciones que no, return NotImplemented podría ser para estas últimas.... realmente depende del programador/diseño. Es por eso que ambos están allí para su uso.

 -4
Author: Jason Coon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-18 17:58:00