Почему Python нуждается в богатом сравнении?

Есть некоторая путаница для меня в течение некоторого времени: есть ли сцена, которая нам нужна для использования богатого сравнения в Python?

Я прочитал официальный документ здесь, но он дает только то, как он работает, а не почему он нам нужен.

Отрывок документа:

Истина x==y не означает, что x!=y является ложным. может описать сцену, в которой нам нужно богатое сравнение. В этой сцене мы можем make __eq__ и __ne__ возвращают False для отключения сравнения или любых других целей. (Мы можем реализовать это, используя __cmp__)

Но это просто предположение, я еще никогда не сталкивался с таким требованием в реальном проекте.

Нужно ли кому-либо использовать богатое сравнение или есть ли другой сценарий, в котором нам нужно использовать богатое сравнение в теории?

Возможно, мой пример x==y и x!=y вызвал некоторую путаницу, извините за это. Позвольте мне сделать это немного яснее:
Есть ли какой-либо сценарий, когда богатое сравнение может помочь, но __cmp__ не может?

Ответы

Ответ 1

NumPy использует богатые сравнения для векторизации ==, !=, < и т.д., как и большинство других операторов. Например,

>>> x = numpy.array([1, 2, 3, 4, 5])
>>> y = numpy.array([2, 2, 1, 4, 4])
>>> x == y
array([False,  True, False,  True, False], dtype=bool)

Когда массивы x и y сравниваются с любым оператором сравнения, NumPy применяет оператор (грубо) по элементу и возвращает массив результатов. Это полезно, например, для применения операции к ячейкам x, которые соответствуют условию:

>>> x[x==y] = 6
>>> x
array([1, 6, 3, 6, 5])

Здесь я выбрал все элементы x, которые соответствуют соответствующим элементам y, и установите их равными 6.

Ответ 2

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

Проект SQLAlchemy полностью перегрузил операторов сравнения, чтобы полностью вернуть что-то еще. Если вы используете:

model1.column == model2.column

или

model1.column != model2.column

или

model1.column < model2.column

где model1 и model2 являются обеими таблицами SQLAlchemy, тогда вы не получите логическое значение, вместо этого вы получаете фильтр SQL-запросов.

Вы используете возвращаемые значения для построения SQL-запросов:

model1.filter(model1.column <= model2.column)

приведет к запросу SQL по строкам:

select model1.*
from model1
left join model2 on model1.foreign_key == model2.primary_key
where
    model1.column <= model2.column

полностью в коде Python, используя синтаксис сравнения с синтаксисом Python.