Подтвердить что ты не робот

Почему документы Python говорят, что мне нужно определить __ne__, когда я определяю __eq__?

В соответствии с Python docs: "при определении __eq__() следует также определить __ne__(), чтобы операторы вели себя как ожидалось".

Однако, похоже, что Python автоматически вычисляет __ne__ как not __eq__:

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

Итак, какая точка определения __ne__, если она просто будет return not self.__eq__(other)? И, кроме того, где это поведение действительно документировано?

ИЗМЕНИТЬ

По-видимому, важно, что я использую Python 3. В Python 2 я получаю

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

Но документы, на которые я ссылаюсь, являются документами Python 3. Были ли они не обновлены?

4b9b3361

Ответ 1

Python 3 изменил поведение для случая ==, см. Python 3, What New:

!= теперь возвращает противоположность ==, если == не возвращает NotImplemented.

Это было признано полезным изменением.

Тот факт, что документация не была обновлена, действительно является долгой ошибкой .

Однако, как отмечает комментарий к отчету, если вы наследуете от класса, который уже определил __ne__, переопределение только __eq__ недостаточно, и вам также придется переопределить метод __ne__.