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,则表达式可以成功。如果没有,那么运行时将退回到内置行为(基于==和!=的标识)。”
因为他们有不同的用例。
引用文档(Python 3.6):
NotImplemented
应该由二进制特殊方法返回(例如__eq__(), __lt__(), __add__(), __rsub__()等),以表明该操作不是相对于其他类型实现的
例外NotImplementedError
[…在用户定义的base中 类,抽象方法应该引发此异常 要求派生类重写方法,或者当类是 正在开发中表明还需要真正的实现 待添加。
详情请参见链接。
由函数返回NotImplemented类似于声明该函数不能处理输入,但不是引发异常,而是将控制传递给另一个称为反射函数的函数,希望反射函数可能能够处理输入。
首先,与任何函数关联的反射函数都是预定义的。其次,当原始函数返回NotImplemented时,解释器运行反射函数,但输入参数的顺序颠倒了。
你可以在这里找到详细的例子