According to the Python docs: "when defining __eq__()
, one should also define __ne__()
so that the operators will behave as expected".
However, it appears that Python computes __ne__
as not __eq__
automatically:
In [8]: class Test:
def __eq__(self, other):
print("calling __eq__")
...: return isinstance(other, Test)
...:
In [9]: a = Test()
In [10]: b = Test()
In [11]: a == b
calling __eq__
Out[11]: True
In [12]: a != b
calling __eq__
Out[12]: False
In [13]: a == 1
calling __eq__
Out[13]: False
In [14]: a != 1
calling __eq__
Out[14]: True
So what's the point of defining __ne__
if it's just going to be return not self.__eq__(other)
? And furthermore, where is this behavior actually documented?
EDIT
Apparently it matters that I am using Python 3. In Python 2, I get
In [1]: class Test(object):
...: def __eq__(self, other):
...: print("calling __eq__")
...: return isinstance(other, Test)
...:
In [2]: a = Test()
In [3]: b = Test()
In [4]: a == b
calling __eq__
Out[4]: True
In [5]: a != b
Out[5]: True
In [6]: a == 1
calling __eq__
Out[6]: False
In [7]: a != 1
Out[7]: True
But the docs I referenced are the Python 3 docs. Were they just not updated?
Python automatically calls the __eq__ method of a class when you use the == operator to compare the instances of the class.
Python's object. __add__(self, other) method returns a new object that represents the sum of two objects. It implements the addition operator + in Python. We call this a “Dunder Method” for “Double Underscore Method” (also called “magic method”).
__ge__(y) to obtain a return value when comparing two objects using x >= y . The return value can be any data type because any value can automatically converted to a Boolean by using the bool() built-in function. If the __ge__() method is not defined, Python will raise a TypeError .
The 'in' Operator in Python The in operator works with iterable types, such as lists or strings, in Python. It is used to check if an element is found in the iterable. The in operator returns True if an element is found. It returns False if not.
Python 3 changed behaviour for the ==
case, see Python 3, What's New:
!=
now returns the opposite of==
, unless==
returnsNotImplemented
.
It was deemed a useful change.
The fact that the documentation has not been updated is indeed a long standing bug.
However, as a comment on the report points out, if you inherit from a class that already has defined __ne__
, overriding just __eq__
is not enough and you'll also have to override the __ne__
method.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With