为什么返回NotImplemented而不是引发NotImplementedError
Python有一个叫NotImplemented
的单例。
为什么有人想要返回NotImplemented
而不是引发NotImplementedError
exception? 难道它不会让它更难find错误,例如执行无效方法的代码吗?
这是因为__lt__()
和相关的比较方法在列表sorting等方面是相当常用的。 有时algorithm会select另一种方式或者select一个默认的赢家。 抛出一个exception,除非被捕获,否则不会被NotImplemented
,而NotImplemented
不会被NotImplemented
,可以用于进一步的testing。
http://jcalderone.livejournal.com/32837.html
总结一下这个链接:
如果
a.__eq__(b)
返回NotImplemented
,那么Python会尝试b.__eq__(a)
。如果b
知道足够的返回True
或False
,则expression式可以成功,否则运行时将回退到内置行为(基于==
和!=
标识)。
因为它们有不同的用例。
引用文档(Python 3.6):
未实现
应该由二进制特殊方法返回(例如
__eq__()
,__lt__()
,__add__()
__lt__()
,__add__()
__rsub__()
等),以指示该操作没有针对其他types
exceptionNotImplementedError
[…]在用户定义的基类中,当抽象方法需要派生类重写方法时,或者在开发类时,抽象方法应该引发这个exception,以指示仍然需要添加真实的实现。
详细信息请参阅链接。
一个原因是性能。 在比较丰富的情况下,您可以在短时间内完成大量操作,但设置和处理大量exception可能比仅返回NotImplemented
值花费更多的时间。
有一些函数会引发exception和函数,而不是return NotImplemented
可能是后者….这实际上取决于程序员/devise。 这就是为什么他们都在使用。