【发布时间】:2017-04-08 09:07:08
【问题描述】:
在 python 3 中从__eq__ 特殊方法返回NotImplemented 的结果是什么(如果重要的话是3.5)?
文档不清楚; only relevant text I found 只是模糊地指“其他一些后备”:
当
NotImplemented返回时,解释器将尝试其他类型的反射操作,或其他一些回退,具体取决于操作员。如果所有尝试的操作都返回NotImplemented,解释器将引发适当的异常。详情请见Implementing the arithmetic operations。
不幸的是,“更多详细信息”链接根本没有提到__eq__。
我对这段摘录的阅读表明,下面的代码应该引发“适当的异常”,但它不会:
class A:
def __eq__(self, other):
return NotImplemented
class B:
def __eq__(self, other):
return NotImplemented
# docs seems to say these lines should raise "an appropriate exception"
# but no exception is raised
a = A()
b = B()
a == b # evaluates as unequal
a == a # evaluates as equal
通过实验,我认为当 NotImplemented 从 __eq__ 返回时,解释器的行为就好像 __eq__ 没有首先定义(具体来说,它首先交换参数,如果没有t 解决问题,它使用默认的__eq__ 进行比较,如果两个对象具有相同的标识,则评估“相等”)。如果是这种情况,我可以在文档中的何处找到此行为的确认信息?
【问题讨论】:
-
要引发异常,您需要在代码中使用
raise NotImplementedError。 -
在我的 Python 3 中,两者都评估为不相等。输入
print("A.eq")和print("A.eq")看看会发生什么。首先称为“A.eq”,后来称为“B.eq”。后来可能在其他可以比较它并返回结果的数据类型中称为eq- 所以它不会引发错误。可能它比较id(A())和id(B())。 -
id()可以与每个对象一起使用,因此您不会出错。__add__没有一些始终有效的通用方法,因此它可以引发异常。 -
stackoverflow.com/questions/878943/… - 第一个答案确认它使用身份。我不确定相关的解释器代码 sn-p 或官方文档链接。
-
@ŁukaszRogalski 是有道理的,但该链接是关于截至 2009 年的 python 2,并且基于博客文章而不是文档。它不应该在官方 python 3 文档中吗?也许我应该在 bugs.python.org 上提出问题?
标签: python python-3.x equality python-internals