Почему 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.