Python a un singleton appelé NotImplemented
.
Pourquoi quelqu'un voudrait-il jamais retourner NotImplemented
au lieu de déclencher l'exception NotImplementedError
? Cela ne rendra-t-il pas simplement plus difficile la recherche de bogues, tels que du code exécutant des méthodes non valides?
C'est parce que __lt__()
et les méthodes de comparaison associées sont assez couramment utilisés indirectement dans les tris de listes et autres. Parfois, l'algorithme choisira d'essayer d'une autre manière ou de choisir un gagnant par défaut. Le fait de lever une exception sortirait du tri s'il n'était pas attrapé, alors que NotImplemented
ne soit pas levé et peut être utilisé dans des tests ultérieurs.
http://jcalderone.livejournal.com/32837.html
Pour résumer ce lien:
"
NotImplemented
signale au moteur d'exécution qu'il devrait demander à quelqu'un d'autre de satisfaire l'opération. Dans l'expressiona == b
, sia.__eq__(b)
renvoieNotImplemented
, alors = Python essayeb.__eq__(a)
. Sib
en sait assez pour renvoyerTrue
ouFalse
, alors l'expression peut réussir. Si ce n’est pas le cas, le moteur d’exécution reviendra au comportement intégré (basé sur l’identité de==
et de!=
). "
Parce qu'ils ont des cas d'utilisation différents.
Citation de la documentation (Python 3.6):
doit être renvoyé par les méthodes spéciales binaires (par exemple,
__eq__()
,__lt__()
,__add__()
,__rsub__()
, etc.) pour indiquer que l'opération n'est pas implémenté par rapport à l'autre type
[...] Dans les classes de base définies par l'utilisateur, les méthodes abstraites doivent déclencher cette exception lorsqu'elles exigent que les classes dérivées remplacent la méthode ou pendant le développement de la classe pour indiquer que l'implémentation réelle doit encore être ajoutée.
Voir les liens pour plus de détails.
Une des raisons est la performance. Dans des situations telles que des comparaisons riches, où vous pouvez effectuer de nombreuses opérations en peu de temps, la configuration et le traitement de nombreuses exceptions peuvent prendre beaucoup plus de temps que le simple renvoi d'une valeur NotImplemented
.