问题:为什么返回NotImplemented而不是引发NotImplementedError
Python有一个称为的单例NotImplemented
。
为什么有人想返回NotImplemented
而不是提出NotImplementedError
exceptions?这是否会使查找错误(例如执行无效方法的代码)变得更加困难?
回答 0
这是因为__lt__()
和相关的比较方法非常普遍地间接用于列表排序等。有时,算法会选择其他方法或选择默认的获胜者。除非捕获到异常,否则引发异常将不会发生,但是NotImplemented
不会引发异常,可以将其用于进一步的测试中。
http://jcalderone.livejournal.com/32837.html
总结该链接:
“
NotImplemented
信号,运行时,它应该让别人来满足使用,在表达a == b
,如果a.__eq__(b)
回报率NotImplemented
,那么Python尝试b.__eq__(a)
。如果b
知道的足够多返回True
或False
,则表达式可以成功。如果没有,那么运行时将退回到内置行为(这是基于身份==
和!=
)“。
回答 1
因为它们有不同的用例。
引用文档(Python 3.6):
应该由二进制特殊的方法被返回(例如
__eq__()
,__lt__()
,__add__()
,__rsub__()
,等等),以指示该操作不相对于实施向其他类型
[…]在用户定义的基类中,当抽象方法要求派生类重写该方法时,或者正在开发该类以指示仍需要添加实际实现时,应引发此异常。
有关详细信息,请参见链接。
回答 2
原因之一是性能。在诸如丰富的比较之类的情况下,您可能会在短时间内进行大量操作,因此设置和处理大量异常可能比直接返回NotImplemented
值花费更多的时间。