为什么返回NotImplemented而不是抛出NotImplementedError

434 投票
5 回答
106267 浏览
提问于 2025-04-15 11:40

Python 有一个叫做 NotImplemented 的单例对象。

那么,为什么有人会选择返回 NotImplemented 而不是抛出 NotImplementedError 异常呢?这样不会让找错误变得更难吗,比如执行了无效的方法?

5 个回答

21

一个原因是性能。在像复杂比较这样的情况下,你可能需要在短时间内进行很多操作。如果要设置和处理很多异常,可能会花费比直接返回一个NotImplemented值更长的时间。

288

因为它们的用途不同。

引用文档(Python 3.6):

NotImplemented

这个值应该在一些特殊的二元方法中返回(比如 __eq__()__lt__()__add__()__rsub__() 等),用来表示这个操作在另一个类型上没有实现。

异常 NotImplementedError

[...] 在用户定义的基类中,当抽象方法需要子类去重写时,应该抛出这个异常,或者在类开发过程中,用来表示真正的实现还需要添加。

详细信息请查看链接。

402

这是因为 __lt__() 以及相关的比较方法在列表排序等操作中经常被间接使用。有时候,算法会选择尝试其他方法或者选一个默认的赢家。如果抛出异常,排序过程会中断,除非这个异常被捕获。而 NotImplemented 不会抛出异常,可以在后续的测试中继续使用。

http://jcalderone.livejournal.com/32837.html

总结一下那个链接的内容:

NotImplemented 告诉运行时系统,它应该去问其他人来完成这个操作。在表达式 a == b 中,如果 a.__eq__(b) 返回 NotImplemented,那么 Python 会尝试 b.__eq__(a)。如果 b 知道怎么返回 TrueFalse,那么这个表达式就能成功。如果不知道,运行时就会退回到内置的行为(对于 ==!= 来说,这个行为是基于对象的身份来判断的)。”

撰写回答