Почему документы 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. Были ли они не обновлены?
Ответы
Ответ 1
Python 3 изменил поведение для случая ==
, см. Python 3, What New:
!=
теперь возвращает противоположность ==
, если ==
не возвращает NotImplemented
.
Это было признано полезным изменением.
Тот факт, что документация не была обновлена, действительно является долгой ошибкой .
Однако, как отмечает комментарий к отчету, если вы наследуете от класса, который уже определил __ne__
, переопределение только __eq__
недостаточно, и вам также придется переопределить метод __ne__
.