为什么返回NotImplemented而不是引发NotImplementedError

Python有一个名为NotImplemented的单例对象。

为什么有人想要返回NotImplemented而不是引发NotImplementedError异常?这难道不会使查找错误(例如执行无效方法的代码)变得更加困难吗?

85476 次浏览

其中一个原因是性能。在像富比较这样的情况下,你可以在短时间内执行大量操作,设置和处理大量异常可能比简单地返回NotImplemented值要长得多。

这是因为__lt__()和相关的比较方法通常间接用于列表排序等。有时算法会选择尝试另一种方法或选择默认赢家。引发异常会打破排序,除非被捕获,而NotImplemented不会被引发,可以在进一步的测试中使用。

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

总结一下这个链接:

NotImplemented向运行时发出信号,它应该请求其他人来满足该操作。在表达式a == b中,如果a.__eq__(b)返回NotImplemented,则Python尝试b.__eq__(a)。如果b知道足够返回TrueFalse,则表达式可以成功。如果没有,那么运行时将退回到内置行为(基于==!=的身份)。”

因为他们有不同的用例。

引用文档(Python 3.6):

NotImplemented

应该由二进制特殊方法返回(例如__eq__()__lt__()__add__()__rsub__(),等等),表明该操作没有针对其他类型实现

exception NotImplementedError

< p >[…在用户定义的base中 类,抽象方法应该引发此异常 要求派生类重写方法,或者当类是 正在开发中表明还需要真正的实现

.

.

详情请参见链接。

由函数返回NotImplemented类似于声明该函数无法处理输入,但不是引发异常,而是将控制传递给另一个称为反射功能的函数,希望反射函数可能能够处理输入。

首先,与任何函数相关联的反射功能是预定义的。其次,当原始函数返回NotImplemented时,解释器运行输入参数的反射功能

你可以找到详细的例子在这里