比较对象方法会导致3.8

考虑这个简单的类:

class A:
    def method(self): pass
    def __eq__(self,other): return True

现在,如果我创建该类的两个实例并比较它们的'method'属性,那么在python 3.7和3.8中会得到不同的结果:

meth1 = A().method
meth2 = A().method
print(meth1 == meth2)  # True in 3.7,False in 3.8

这是怎么回事?为什么方法在3.7中相等但在3.8中相等?这和__eq__有什么关系?

cele2000 回答:比较对象方法会导致3.8

发生的事是基于this commit(和issue 16171610)的this discussion on python-dev

具有以下(选定的)注释:

  

在我看来,两个不同实例的实例方法是否相等取决于实例的相等性是不合逻辑的。

之后

  

总的来说,我认为这部分是偶然的   从来没有设计过

  

我认为实例的相等性测试毫无意义   方法将实例的相等性考虑在内。恕我直言   行为与不出所料的原则不一致。的   正确的行为(当然也是恕我直言)是仅实例方法   比较等于相同实例的相同实例方法,其中   “相同实例”基于“是”而不基于“ ==”。

  

此更改可以被认为是一个错误修复,但是由于它可能破坏用户代码(不太可能),因此将其合并到3.8中并作为新功能公开可能更安全。

因此,这似乎被认为是错误修复/功能,因为绑定方法仅在绑定到同一实例上时才应该相等,而不是在实例被认为相等时才应该相等。在Python instance1 == instance2的等效项(因此调用您的__eq__),而在Python 3.8中,它检查是否instance1 is instance2


可以在section "Python 3.8.0 alpha 1"中找到相应的变更日志项目-它是一长列项目,因此我在此处提供了一个副本:

  
      
  • bpo-1617161BuiltinMethodType实例(内置类方法)的哈希值现在取决于 __ self __ 的身份的哈希值,而不是其值。 ModuleTypeMethodWrapperType实例的哈希值和相等性(用户定义类的方法以及诸如str.__add__之类的内置类的某些方法)现在取决于哈希值和身份标识的相等性 __ self __ 而不是其值。 MethodWrapperType个实例不再支持排序。
  •   
本文链接:https://www.f2er.com/3115889.html

大家都在问