【发布时间】:2010-10-27 02:36:57
【问题描述】:
Python 有一个名为 NotImplemented 的单例。
为什么有人想要返回 NotImplemented 而不是引发 NotImplementedError 异常?会不会让查找错误变得更加困难,例如执行无效方法的代码?
【问题讨论】:
Python 有一个名为 NotImplemented 的单例。
为什么有人想要返回 NotImplemented 而不是引发 NotImplementedError 异常?会不会让查找错误变得更加困难,例如执行无效方法的代码?
【问题讨论】:
通过函数返回NotImplemented类似于声明该函数无法处理输入,但不是引发异常,而是将控制权转移到另一个称为反射函数的函数,希望反射函数可能能够处理输入。
首先,与任何函数关联的反射函数都是预定义的。其次,当原始函数返回NotImplemented 时,解释器运行反射函数,但输入参数的翻转顺序。
你可以找到详细的例子here
【讨论】:
一个原因是性能。在诸如丰富比较的情况下,您可能会在短时间内执行大量操作,设置和处理大量异常可能需要比简单地返回 NotImplemented 值更长的时间。
【讨论】:
因为它们有不同的用例。
引用文档(Python 3.6):
应该由二进制特殊方法返回(例如
__eq__(),__lt__()、__add__()、__rsub__()等)表示该操作相对于其他类型没有实现
[...] 在用户定义的基础中 类,抽象方法应该引发这个异常,当他们 要求派生类覆盖该方法,或者当该类是 正在开发以表明真正的实现仍然需要 待补充。
查看链接了解详情。
【讨论】:
这是因为__lt__() 和相关的比较方法在列表排序等中非常常用。有时算法会选择尝试另一种方式或选择默认的获胜者。除非被捕获,否则引发异常会中断排序,而 NotImplemented 不会被引发并且可以在进一步的测试中使用。
http://jcalderone.livejournal.com/32837.html
总结该链接:
"
NotImplemented向运行时发出信号,它应该要求其他人来满足操作。在表达式a == b中,如果a.__eq__(b)返回NotImplemented,则Python 尝试b.__eq__(a)。如果b知道足以返回True或False,则表达式可以成功。如果不成功,则运行时将回退到内置行为(基于==和!=的标识) 。”
【讨论】:
a.__eq__(b) 是否返回 NotImplemented 时,它不能轻松地捕获 NotImplementedError(然后调用 b.__eq__(a) 或其他什么)吗?