为什么NotImplemented会被评估为True?

6

最近我偶然发现了Python的NotImplemented内置函数。经过一些阅读,我现在明白了它的用途,但我不明白为什么它作为布尔值时会评估为True。下面的示例让我觉得这像是某种残酷的玩笑:

>>> class A:
...     def __eq__(self, other):
...         return NotImplemented
... 
>>> 
>>> a = A()
>>> a == 1
False
>>> bool(a.__eq__(1))
True

我的问题很简单:为什么NotImplemented的评估结果是True

通常情况下,应该抛出异常而不是返回。 - Ruggero Turra
@RuggeroTurra NotImplementedNotImplementedType 类型,它根本不是异常。确实存在一个 NotImplementedError;在这种情况下,我可能会用 raise NotImplementedError 替换 return NotImplemented - Matthew Trevor
1个回答

13

因为它不等于False; 默认情况下,除非对象长度为0(容器)或为零(数字),否则所有对象都被认为是True; 请参阅Truth Value Testing reference

然而,返回NotImplemented表示向Python发出信号,说明相等性测试未实现,并尝试反向(1).__eq__(a)。如果该方法也不存在,则这些对象只有在不是同一对象时才不相等(a is 1False)。

换句话说,NotImplemented是一个特殊的单例对象,用于向Python发出信号,表明您希望Python尝试其他操作,因为该对象与其他对象之间的相等性测试不受支持。

因此,它从未被设计用于布尔上下文中。它永远不会表示“False”。

笔误:应该是“默认情况下,除非长度为0(容器)或值为0(数值),否则所有对象都被视为True”。具有非零值的数值对象将被视为“True”。 - dawg
@Martijn Pieters:我仍然认为它的书写方式是反向的,不是吗?应该是...默认情况下,除了False或None对象之外,所有对象都被视为True;或者长度为0(容器);或者评估为零(数字);或者定义__nonzero__。如果某些数字评估为非零,则为True。bool(.00001) - dawg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接