为什么返回NotImplemented而不是抛出NotImplementedError
Python 有一个叫做 NotImplemented
的单例对象。
那么,为什么有人会选择返回 NotImplemented
而不是抛出 NotImplementedError
异常呢?这样不会让找错误变得更难吗,比如执行了无效的方法?
5 个回答
一个原因是性能。在像复杂比较这样的情况下,你可能需要在短时间内进行很多操作。如果要设置和处理很多异常,可能会花费比直接返回一个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
,那么这个表达式就能成功。如果不知道,运行时就会退回到内置的行为(对于==
和!=
来说,这个行为是基于对象的身份来判断的)。”