By asmeurer

2014-06-27 15:23:36 8 Comments

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?


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?


@Martijn Pieters 2014-06-27 15:55:30

Python 3 changed behaviour for the == case, see Python 3, What's New:

!= now returns the opposite of ==, unless == returns NotImplemented.

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.

Related Questions

Sponsored Content

22 Answered Questions

[SOLVED] Creating a singleton in Python

10 Answered Questions

[SOLVED] Why is it string.join(list) instead of list.join(string)?

  • 2009-01-29 22:45:13
  • Evan Fosmark
  • 1236006 View
  • 1661 Score
  • 10 Answer
  • Tags:   python string list

20 Answered Questions

9 Answered Questions

10 Answered Questions

26 Answered Questions

[SOLVED] Why are Python lambdas useful?

8 Answered Questions

[SOLVED] Defining private module functions in python

1 Answered Questions

[SOLVED] How to define static class attributes in Python from C++?

  • 2017-09-09 16:59:00
  • YiFei
  • 91 View
  • 1 Score
  • 1 Answer
  • Tags:   python c++

3 Answered Questions

4 Answered Questions

[SOLVED] Why/When in Python does `x==y` call `y.__eq__(x)`?

Sponsored Content