operator overloading - Why do the Python docs say I need to define __ne__ when I define __eq__? -
according python docs: "when defining __eq__(), 1 should define __ne__() operators behave expected".
however, appears python computes __ne__ not __eq__ automatically:
in [8]: class test: def __eq__(self, other): print("calling __eq__") ...: return isinstance(other, test) ...: in [9]: = test() in [10]: b = test() in [11]: == b calling __eq__ out[11]: true in [12]: != b calling __eq__ out[12]: false in [13]: == 1 calling __eq__ out[13]: false in [14]: != 1 calling __eq__ out[14]: true so what's point of defining __ne__ if it's going return not self.__eq__(other)? , furthermore, behavior documented?
edit
apparently matters using python 3. in python 2, get
in [1]: class test(object): ...: def __eq__(self, other): ...: print("calling __eq__") ...: return isinstance(other, test) ...: in [2]: = test() in [3]: b = test() in [4]: == b calling __eq__ out[4]: true in [5]: != b out[5]: true in [6]: == 1 calling __eq__ out[6]: false in [7]: != 1 out[7]: true but docs referenced python 3 docs. not updated?
python 3 changed behaviour == case, see python 3, what's new:
!=returns opposite of==, unless==returnsnotimplemented.
it deemed a useful change.
the fact documentation has not been updated indeed long standing bug.
however, comment on report points out, if inherit class has defined __ne__, overriding __eq__ not enough , you'll have override __ne__ method.
Comments
Post a Comment