Зачем возвращать NotImplemented вместо повышения NotImplementedError - PullRequest
221 голосов
/ 18 мая 2009

Python имеет синглтон с именем NotImplemented.

Почему кто-то хотел бы вернуть NotImplemented вместо вызова исключения NotImplementedError? Разве это не затруднит поиск ошибок, таких как код, выполняющий недопустимые методы?

Ответы [ 4 ]

234 голосов
/ 18 мая 2009

Это потому, что __lt__() и связанные методы сравнения довольно часто используются косвенно в списках и тому подобное. Иногда алгоритм может выбрать другой способ или выбрать победителя по умолчанию. Возбуждение исключения вырвалось бы из рода, если оно не было обнаружено, тогда как NotImplemented не поднялось и может быть использовано в дальнейших тестах.

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

Подводя итог этой ссылке:

"NotImplemented сообщает среде выполнения, что он должен попросить кого-то еще выполнить операцию. В выражении a == b, если a.__eq__(b) возвращает NotImplemented, тогда Python пытается b.__eq__(a). Если b знает Достаточно, чтобы вернуть True или False, тогда выражение может завершиться успешно. Если это не так, тогда среда выполнения вернется к встроенному поведению (которое основано на идентичности для == и !=) . "

59 голосов
/ 15 июня 2017

Потому что у них разные варианты использования.

Цитирование документов (Python 3.6):

NotImplemented

должно быть возвращено двоичными специальными методами (например, __eq__(), __lt__(), __add__(), __rsub__() и т. Д.), Чтобы указать, что операция не реализована в отношении другого типа

исключение NotImplementedError

[...] В определенной пользователем базе классы, абстрактные методы должны вызывать это исключение, когда они требовать, чтобы производные классы переопределяли метод, или когда класс разрабатывается, чтобы показать, что реальная реализация все еще нуждается будет добавлено.

Подробнее см. Ссылки.

8 голосов
/ 18 мая 2009

Одной из причин является производительность. В такой ситуации, как расширенные сравнения, когда вы могли бы выполнять много операций за короткое время, настройка и обработка большого числа исключений может занять гораздо больше времени, чем просто возвращение значения NotImplemented.

0 голосов
/ 18 мая 2009

Существуют функции, которые вызывают исключения, и функции, которые этого не делают, return NotImplemented может быть для последнего .... это действительно зависит от программиста / дизайна. Вот почему они оба там для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...