[英]Why Python need rich comparison?
有一段時間我對此感到困惑:我們是否需要在Python中使用豐富的比較?
我在這里閱讀官方文檔,但它只是給出了它的工作原理,而不是我們需要它的原因。
該文檔的片段:
x==y
的真實性並不意味着x!=y
是假的。 可以描述一個我們需要豐富比較的場景。 在這個場景中,我們可以使__eq__
和__ne__
都返回False
以禁用比較或任何其他目的。 (我們可以通過使用__cmp__
來實現這一點)
但這只是猜測,我從未在真正的項目中遇到過這樣的要求。
有沒有人需要使用豐富的比較,還是有任何其他需要在理論上使用豐富的比較的場景?
也許我的x==y
和x!=y
例子引起了一些混亂,對不起。 讓我說清楚一點:
是否有任何情況下豐富的比較可以幫助,但__cmp__
不能?
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。
您甚至不需要返回布爾值。 文檔的重點在於,您可以完全自由地重載方法可以返回的內容; 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豐富的比較語法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.