我有一段时间的困惑:我们是否需要在Python中使用丰富的比较?
我阅读了官方文档here,但它只是说明了它的工作方式,而不是我们需要的原因。
文档的片段:
x==y
的真相并不意味着x!=y
是假的。可能会描述我们需要进行丰富比较的场景。在这个场景中,我们可以 将__eq__
和__ne__
都返回False
以禁用 比较或任何其他目的。 (我们可以通过使用来实现这一点__cmp__
)
但这只是猜测,我从未在真正的项目中遇到过这样的要求。
是否有人确实需要使用丰富的比较,还是在理论上我们需要使用丰富的比较?
也许我的x==y
和x!=y
的例子引起了一些混乱,对不起。
让我说清楚一点:
是否有任何情况下丰富的比较可以帮助,但__cmp__
不能?
答案 0 :(得分:8)
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。
答案 1 :(得分:7)
您甚至不需要返回布尔值。文档的重点在于,您可以完全自由地重载方法可以返回的内容; Python不强制 __eq__
和__ne__
返回一致的布尔值。
SQLAlchemy project完全重载了丰富的比较运算符以完全返回其他内容。如果您使用:
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丰富的比较语法。