簡體   English   中英

為什么Python需要豐富的比較?

[英]Why Python need rich comparison?

有一段時間我對此感到困惑:我們是否需要在Python中使用豐富的比較?

我在這里閱讀官方文檔,但它只是給出了它的工作原理,而不是我們需要它的原因。

該文檔的片段:

x==y的真實性並不意味着x!=y是假的。 可以描述一個我們需要豐富比較的場景。 在這個場景中,我們可以使__eq____ne__都返回False以禁用比較或任何其他目的。 (我們可以通過使用__cmp__來實現這一點)

但這只是猜測,我從未在真正的項目中遇到過這樣的要求。

有沒有人需要使用豐富的比較,還是有任何其他需要在理論上使用豐富的比較的場景?

也許我的x==yx!=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)

當數組xy與任何比較運算符進行比較時,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

其中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豐富的比較語法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM