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