Зачем возвращать 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 могут быть для последнего... это действительно зависит от программиста/дизайна. Вот почему они оба используются для использования.