У 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
значения.