有一段时间我有一个困惑:有没有一个场景我们确实需要在Python中使用丰富的比较?
我读过官方文档here,但它只说明了它是如何工作的,而不是我们为什么需要它。
文档的一个片段:
x==y
的真假并不意味着x!=y
就是假的。可以描述一个我们需要丰富对比的场景。在这个场景中,我们可以让__eq__
和__ne__
都返回False
,以禁用比较或任何其他目的。(我们可以使用__cmp__
来实现这一点)
但这只是一个猜测,我还没有在真正的项目中遇到过这样的需求。
有没有人真的需要使用丰富的比较,或者在理论上有任何其他场景我们需要使用丰富的比较?
也许我的x==y
和x!=y
的例子引起了一些混淆,很抱歉。让我说得更清楚一点:
有没有什么情况下,丰富的比较可以帮助,但__cmp__
不能?
发布于 2014-01-08 16:07:45
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])
在这里,我选择了与y
的相应元素相等的x
的所有元素,并将它们设置为6。
发布于 2014-01-08 16:06:53
您甚至不需要返回布尔值。文档的要点是,您可以完全自由地控制重载方法可以返回的内容;Python并不强制要求__eq__
和__ne__
返回一致的布尔值。
SQLAlchemy project完全重载了丰富的比较运算符以返回完全不同的内容。如果您使用:
model1.column == model2.column
或
model1.column != model2.column
或
model1.column < model2.column
其中model1
和model2
都是SQL表模型,那么您得到的不是布尔值,而是SQLAlchemy查询过滤器。
您可以使用返回值构造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丰富的比较语法。
https://stackoverflow.com/questions/20989750
复制相似问题