我最近偶然发现了Python的内置NotImplemented
。经过一些阅读后,我现在就明白了它的目的,但我不明白它为什么评价为True
作为布尔值。以下示例使我觉得这对我来说是一种残酷的玩笑:
>>> class A:
... def __eq__(self, other):
... return NotImplemented
...
>>>
>>> a = A()
>>> a == 1
False
>>> bool(a.__eq__(1))
True
我的问题很简单:为什么NotImplemented
评估为True
?
答案 0 :(得分:11)
因为它不评估为False
; 默认是考虑所有对象True
,除非它们有length of 0(容器)或are zero(数字);请参阅Truth Value Testing reference。
然而,向Python返回NotImplemented
信号,表示未执行相等测试,而是尝试使用反(1).__eq__(a)
。如果该方法也不存在,则如果对象不是同一个对象(a is 1
是False
),则它们不相等。
换句话说,NotImplemented
是一个特殊的单例对象,是一个向Python发信号的哨兵,你希望Python尝试别的东西,因为不支持这个对象和另一个对象之间的相等测试。
因此,它从未打算在布尔上下文中使用。它绝不意味着传达False
。