考慮下面的Python程序:Python的列表.__包含___調用__eq__的順序是什麼?
class Foo(object):
def __init__(self, bar):
self.bar = bar
def __repr__(self):
return 'Foo(%r)' % (self.bar,)
def __eq__(self, other):
print('Foo.__eq__(%r, %r)' % (self, other))
return self.bar == other
foo1 = Foo('A')
foo2 = Foo('B')
assert foo1 not in [foo2]
在CPython的2.7.11和3.5.1,它打印:
Foo.__eq__(Foo('A'), Foo('B'))
Foo.__eq__(Foo('B'), 'A')
但PyPy 5.3.1(2.7)下,它打印:
Foo.__eq__(Foo('B'), Foo('A'))
Foo.__eq__(Foo('A'), 'B')
儘管Python 3.5的文檔states即使「如果可能」應該是對稱的,有時卻不是。在這種情況下,參數Foo.__eq__
的順序變得重要。
那麼,上面的CPython行爲是一個實現細節,還是它的一部分list
的公共接口(意味着PyPy有一個bug)?請解釋你爲什麼這麼認爲。
我應該更徹底地閱讀文檔... –
等等,它說'x == e'必須是'x .__ eq __(e)'? –
@Rawing https://docs.python.org/2/reference/datamodel.html#object.__eq__ –