web-dev-qa-db-fra.com

Pourquoi renvoyer NotImplemented au lieu d'élever NotImplementedError

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?

237
abyx

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'expression a == b, si a.__eq__(b) renvoie NotImplemented, alors = Python essaye b.__eq__(a). Si b en sait assez pour renvoyer True ou False, 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 !=). "

246
SpliFF

Parce qu'ils ont des cas d'utilisation différents.

Citation de la documentation (Python 3.6):

NotImplemented

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

exception NotImplementedError

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

72
Paolo

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.

10
RichieHindle