为什么返回NotImplemented而不是引发NotImplementedError

Python有一个叫NotImplemented的单例。

为什么有人想要返回NotImplemented而不是引发NotImplementedErrorexception? 难道它不会让它更难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知道足够的返回TrueFalse ,则expression式可以成功,否则运行时将回退到内置行为(基于==!=标识)。

因为它们有不同的用例。

引用文档(Python 3.6):

未实现

应该由二进制特殊方法返回(例如__eq__()__lt__()__add__() __lt__()__add__() __rsub__()等),以指示该操作没有针对其他types

exceptionNotImplementedError

[…]在用户定义的基类中,当抽象方法需要派生类重写方法时,或者在开发类时,抽象方法应该引发这个exception,以指示仍然需要添加真实的实现。

详细信息请参阅链接。

一个原因是性能。 在比较丰富的情况下,您可以在短时间内完成大量操作,但设置和处理大量exception可能比仅返回NotImplemented值花费更多的时间。

有一些函数会引发exception和函数,而不是return NotImplemented可能是后者….这实际上取决于程序员/devise。 这就是为什么他们都在使用。