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?
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óna == b
, sia.__eq__(b)
devuelveNotImplemented
, Python intentab.__eq__(a)
. Sib
sabe lo suficiente para devolverTrue
oFalse
, 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!=
)."
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):
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.
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
.
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.
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