为什么NotImplemented会评估为True?
我最近发现了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
的。