У Python есть синглтон NotImplemented.
Почему кто-то хотел бы когда-нибудь вернуться NotImplementedвместо того, чтобы поднять NotImplementedErrorисключение? Разве это не затруднит поиск ошибок, таких как код, выполняющий недопустимые методы?
У Python есть синглтон NotImplemented.
Почему кто-то хотел бы когда-нибудь вернуться NotImplementedвместо того, чтобы поднять NotImplementedErrorисключение? Разве это не затруднит поиск ошибок, таких как код, выполняющий недопустимые методы?
Ответы:
Это потому, что __lt__()и связанные методы сравнения довольно часто используются косвенно в списках и тому подобное. Иногда алгоритм может выбрать другой способ или выбрать победителя по умолчанию. Возбуждение исключения вырвалось бы из рода, если оно не было поймано, тогда NotImplementedкак не вызывается и может использоваться в дальнейших тестах
http://jcalderone.livejournal.com/32837.html
Подводя итог этой ссылке:
"
NotImplementedсигнализирует среде выполнения, что он должен попросить кого-то другого выполнить операцию. В выраженииa == b, еслиa.__eq__(b)возвращаетсяNotImplemented, то Python пытаетсяb.__eq__(a). Еслиbзнает достаточно для возвратаTrueилиFalse, тогда выражение может завершиться успешно. Если это не так, тогда среда выполнения будет отступить к встроенному поведению (которое основано на идентичности для==и!=). "
a.__eq__(b)возвращен ли NotImplemented, не может ли он так же легко перехватить NotImplementedError вместо этого (и затем вызвать b.__eq__(a)или что-то еще)?
Потому что у них разные варианты использования.
Цитирование документов (Python 3.6):
должны быть возвращены бинарными специальными методами (например
__eq__(),__lt__(),__add__(),__rsub__()и т.д.) , чтобы указать , что операция не осуществляется в отношении другого типа
исключение NotImplementedError
[...] В определяемых пользователем базовых классах абстрактные методы должны вызывать это исключение, когда им требуется, чтобы производные классы переопределяли метод, или когда класс разрабатывается, чтобы указать, что реальная реализация все еще должна быть добавлена.
Смотрите ссылки для деталей.
Одной из причин является производительность. В такой ситуации, как расширенные сравнения, когда вы могли бы выполнить много операций за короткое время, настройка и обработка большого числа исключений может занять гораздо больше времени, чем просто возвращение NotImplementedзначения.