为什么NotImplemented评估为True?

Rem*_*ing 6 python

我最近偶然发现了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 1is False),则它们不相等.

换句话说,NotImplemented是一个特殊的单例对象,一个向Python发送信号的标记,你希望Python尝试别的东西,因为不支持这个对象和另一个对象之间的相等性测试.

因此,它从未打算在布尔上下文中使用.它永远不会传达False.