Man*_*lva 11 python python-datamodel python-internals
根据object.__eq__()文档,默认(即在object类中)实现==如下:
True if x is y else NotImplemented
Run Code Online (Sandbox Code Playgroud)
仍然遵循的文档NotImplemented,我推断这NotImplemented意味着 Python 运行时将尝试以相反的方式进行比较。y.__eq__(x)即如果x.__eq__(y)返回则尝试NotImplemented(在运算符的情况下==)。
现在,在 python 3.9 中False打印以下代码:True
class A:
pass
print(A() == A())
print(bool(NotImplemented))
Run Code Online (Sandbox Code Playgroud)
所以我的问题如下:文档在哪里提到了NotImplemented在上下文中的特殊行为__eq__?
PS:我在CPython 源代码中找到了答案,但我想这必须/应该在文档中的某个位置。
根据
object.__eq__()文档,默认(即在对象类中)实现==如下
不; 这是的__eq__默认实现。==,作为一个运算符,不能在类中实现。
Python 的运算符实现是协作的。有硬编码逻辑使用 dunder 方法来确定应该发生什么,并且可能会退回到默认值。这种逻辑不属于任何类。
您可以看到另一个内置的示例len:类可以从其__len__方法中返回任何它喜欢的内容,原则上您可以直接调用它并获取任何类型的值。然而,这并没有正确实现协议,并且len当它没有返回非负整数时会抱怨。没有任何类包含类型检查和值检查逻辑。它是外部的。
仍然遵循 的文档
NotImplemented,我推断这NotImplemented意味着 Python 运行时将尝试以相反的方式进行比较。y.__eq__(x)即如果x.__eq__(y)返回则尝试NotImplemented(在运算符的情况下==)。
NotImplemented只是一个对象。这不是语法。它没有任何特殊的行为,并且在Python中,除了返回值之外,简单地返回一个值不会触发特殊的行为。
二元运算符的外部代码将尝试寻找匹配的,如果不起作用则__op__尝试寻找匹配的。此时,不是一个可接受的答案(它是专门为此目的而存在的哨兵,因为是一个可接受的答案)。一般来说,如果到目前为止答案仍然是,那么外部代码就会。__rop____op__NotImplementedNone NotImplementedraise NotImplementedError
作为一种特殊情况,不提供自己的比较的对象(即,默认的 fromobject用于__eq__or __ne__)将作为“不相等”进行比较,除非它们相同。C实现重复身份检查(我猜是在类显式定义__eq__或直接__ne__定义的情况下return NotImplemented)。这是因为给出这个结果被认为是明智的,而==当存在合理的默认值时,总是失败是令人讨厌的。
但是,如果没有显式逻辑,这两个对象仍然无法排序,因为没有合理的默认值。(您可以比较指针值,但它们是任意的,并且与实现这一点的 Python 逻辑没有任何关系;因此,以这种方式排序对于编写 Python 代码来说实际上没有用处。)因此,例如,如果未提供比较逻辑,x < y则会引发 a 。TypeError(即使; x is y您可以合理地说在这种情况下<=和>=应该为真,并且<和>应该为假,它也会这样做,但它使事情变得太复杂并且不是很有用。)
[观察:
print(bool(NotImplemented))打印True]
嗯,是; NotImplemented是一个对象,所以默认情况下它是真的;它不代表数值,也不是容器,因此没有理由它是假的。
然而,这也没有告诉我们任何有用的东西。我们不关心这里的真实性NotImplemented,并且在 Python 实现中也不会这样使用。它只是一个哨兵值。
文档在哪里提到了 NotImplemented 在上下文中的特殊行为
__eq__?
无处可去,因为这不是 的行为NotImplemented,如上所述。
好的,但这留下了潜在的问题:文档在哪里解释了==操作员默认执行的操作?
答案:因为我们讨论的是运算符,而不是方法,所以它不在有关 dunder 方法的部分中。这是第 6 节,讨论表达式。具体来说,6.10.1。价值比较:
==相等比较(和)的默认行为!=基于对象的标识。因此,具有相同身份的实例的相等比较会导致相等,而具有不同身份的实例的相等比较会导致不平等。这种默认行为的动机是希望所有对象都应该是自反的(即x is y暗示x == y)。