我最近偶然发现了Python的NotImplemented
内置.经过一些阅读后,我确实得到了它的目的,但我不明白它为什么评估True
为布尔值.下面的例子让我觉得这是一种残酷的玩笑:
>>> class A:
... def __eq__(self, other):
... return NotImplemented
...
>>>
>>> a = A()
>>> a == 1
False
>>> bool(a.__eq__(1))
True
Run Code Online (Sandbox Code Playgroud)
我的问题很简单:为什么要NotImplemented
评价True
?
Mar*_*ers 11
因为它不评估False
; 的默认是考虑所有的对象True
,除非他们具有的0长度(容器),或为零(数字); 请参阅真值测试参考.
但是,NotImplemented
向Python 返回没有实现相等性测试的信号,(1).__eq__(a)
而是尝试反向.如果该方法也不存在,则如果它们不是同一个对象(a is 1
is False
),则它们不相等.
换句话说,NotImplemented
是一个特殊的单例对象,一个向Python发送信号的标记,你希望Python尝试别的东西,因为不支持这个对象和另一个对象之间的相等性测试.
因此,它从未打算在布尔上下文中使用.它永远不会传达False
.