为什么NotImplemented会评估为True?

6 投票
1 回答
1644 浏览
提问于 2025-04-18 04:56

我最近发现了Python中的一个内置功能NotImplemented。经过一番阅读,我明白了它的用途,但我不明白为什么它在布尔值中会被当作True来处理。下面这个例子让我觉得这简直像是个恶作剧:

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

我的问题很简单:为什么NotImplemented会被当作True

1 个回答

13

因为它不会被判断为 False;默认情况下,所有对象都会被认为是 True,除非它们的 长度为0(比如空的容器),或者 值为0(数字类型)。具体可以参考 真值测试的相关内容

不过,如果返回 NotImplemented,这就告诉Python这个相等性测试没有实现,然后Python会尝试反向的 (1).__eq__(a)。如果这个方法也不存在,那么如果这两个对象不是同一个对象,它们就不相等(a is 1 会返回 False)。

换句话说,NotImplemented 是一个特殊的单例对象,用来告诉Python你希望它尝试其他的方式,因为这个对象和另一个对象之间的相等性测试不被支持。

所以,它本来就不应该在布尔上下文中使用,也不是用来表示 False 的。

撰写回答