Почему у Python есть __ne__ operator method вместо __eq__?

В ответе здесь приведена ссылка на случай, когда вы хотите, чтобы __ne__ возвращал нечто, отличное от логического обратного __eq__, но я не может представить такого случая. Любые примеры?

Ответ 1

SQLAlchemy - отличный пример. Для непосвященных SQLAlchemy является ORM и использует выражение Python для генерации SQL-операторов. В выражении, таком как

meta.Session.query(model.Theme).filter(model.Theme.id == model.Vote.post_id)

model.Theme.id == model.VoteWarn.post_id не возвращает логическое значение, а объект, который в конечном итоге создает SQL-запрос, например WHERE theme.id = vote.post_id. Обратный создавал бы нечто вроде WHERE theme.id <> vote.post_id, поэтому оба метода должны быть определены.

Ответ 2

Некоторые библиотеки придумывают вещи и не возвращают bool из этих операций. Например, с numpy:

>>> import numpy as np
>>> np.array([1,2,5,4,3,4,5,4,4])==4
array([False, False, False,  True, False,  True, False,  True,  True], dtype=bool)
>>> np.array([1,2,5,4,3,4,5,4,4])!=4
array([ True,  True,  True, False,  True, False,  True, False, False], dtype=bool)

Когда вы сравниваете массив с одним значением или другим массивом, вы возвращаете массив bools результатов сравнения соответствующих элементов. Вы не могли бы сделать этого, если x!=y просто эквивалентно not (x==y).

Ответ 3

В более общем плане, в многозначной логике, equals и not equals не обязательно являются точными инверсиями друг друга.

Очевидным примером является SQL, где True == True, False == False и Null != Null. Хотя я не знаю, есть ли какие-либо конкретные примеры Python, я могу себе представить, что это реализуется в местах.