Python有一个名为NotImplemented的单例对象。
NotImplemented
为什么有人想要返回NotImplemented而不是引发NotImplementedError异常?这难道不会使查找错误(例如执行无效方法的代码)变得更加困难吗?
NotImplementedError
其中一个原因是性能。在像富比较这样的情况下,你可以在短时间内执行大量操作,设置和处理大量异常可能比简单地返回NotImplemented值要长得多。
这是因为__lt__()和相关的比较方法通常间接用于列表排序等。有时算法会选择尝试另一种方法或选择默认赢家。引发异常会打破排序,除非被捕获,而NotImplemented不会被引发,可以在进一步的测试中使用。
__lt__()
http://jcalderone.livejournal.com/32837.html
总结一下这个链接:
NotImplemented向运行时发出信号,它应该请求其他人来满足该操作。在表达式a == b中,如果a.__eq__(b)返回NotImplemented,则Python尝试b.__eq__(a)。如果b知道足够返回True或False,则表达式可以成功。如果没有,那么运行时将退回到内置行为(基于==和!=的身份)。”
a == b
a.__eq__(b)
b.__eq__(a)
b
True
False
==
!=
因为他们有不同的用例。
引用文档(Python 3.6):
应该由二进制特殊方法返回(例如__eq__(), __lt__(), __add__(), __rsub__(),等等),表明该操作没有针对其他类型实现
__eq__()
__add__()
__rsub__()
exception NotImplementedError
< p >[…在用户定义的base中 类,抽象方法应该引发此异常 要求派生类重写方法,或者当类是 正在开发中表明还需要真正的实现 . .
详情请参见链接。
由函数返回NotImplemented类似于声明该函数无法处理输入,但不是引发异常,而是将控制传递给另一个称为反射功能的函数,希望反射函数可能能够处理输入。
首先,与任何函数相关联的反射功能是预定义的。其次,当原始函数返回NotImplemented时,解释器运行输入参数的反射功能。
你可以找到详细的例子在这里