为什么Python需要丰富的比较?

时间:2014-01-08 07:46:39

标签: python

我有一段时间的困惑:我们是否需要在Python中使用丰富的比较?

我阅读了官方文档here,但它只是说明了它的工作方式,而不是我们需要的原因。

文档的片段:

  

x==y的真相并不意味着x!=y是假的。可能会描述我们需要进行丰富比较的场景。在这个场景中,我们可以   将__eq____ne__都返回False以禁用   比较或任何其他目的。 (我们可以通过使用来实现这一点   __cmp__

但这只是猜测,我从未在真正的项目中遇到过这样的要求。

是否有人确实需要使用丰富的比较,还是在理论上我们需要使用丰富的比较?

也许我的x==yx!=y的例子引起了一些混乱,对不起。 让我说清楚一点:
是否有任何情况下丰富的比较可以帮助,但__cmp__不能?

2 个答案:

答案 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)

当数组xy与任何比较运算符进行比较时,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

其中model1model2都是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丰富的比较语法。