2012-02-26 117 views
36

答案here給出了您希望__ne__返回除__eq__的邏輯逆之外的其他情況的手寫參考,但我無法想象出任何此類情況。任何例子?爲什麼Python有一個__ne__運算符方法而不是__eq__?

+7

至少對''''和'<='有這樣的情況。即'NaN < anything => false'和'NaN> = anything => false'。 (假設python遵循IEEE浮點邏輯) – CodesInChaos 2012-02-26 11:04:09

+3

是的,基本上任何沒有[total order](http://en.wikipedia.org/wiki/Total_ordering)的東西都可以歸入這個類別。由於顯而易見的原因,這些東西很少見,但它們確實存在。 NaN是一個很好的例子。 – Voo 2012-02-26 11:09:48

+0

只因爲你能。 – 2012-02-26 11:24:25

回答

28

SQLAlchemy就是一個很好的例子。對於未初始化的,SQLAlchemy是一個ORM並使用Python表達式來生成SQL語句。在表達如

meta.Session.query(model.Theme).filter(model.Theme.id == model.Vote.post_id) 

model.Theme.id == model.VoteWarn.post_id不返回一個布爾值,但最終能產生像WHERE theme.id = vote.post_id一個SQL查詢的對象。反過來會產生類似於WHERE theme.id <> vote.post_id的東西,所以這兩種方法都需要定義。

29

一些圖書館花哨的東西,並沒有從這些操作返回布爾。例如,對於numpy的:

>>> import numpy as np 
>>> np.array([1,2,5,4,3,4,5,4,4])==4 
array([False, False, False, True, False, True, False, True, True], dtype=bool) 
>>> np.array([1,2,5,4,3,4,5,4,4])!=4 
array([ True, True, True, False, True, False, True, False, False], dtype=bool) 

當比較的陣列,以一個單一的值或另一個陣列你回到比較相應的元件的結果的布爾變量的陣列。如果x!=y僅僅等於not (x==y),則無法執行此操作。

+0

我不能那樣做。考慮到'not'是以明顯的方式在一個布爾數組上定義的,我們仍然不需要'neq'而不是'not equals'。但顯然這裏有一個表現和可能的記憶優勢。 – Voo 2012-02-26 18:12:15

+6

雖然可以使用'__not__'特殊方法來覆蓋'not'運算符,但這在Python中當前不存在。 – Weeble 2012-02-26 18:50:29

+0

哦,這是令人驚訝的..是的,在這種情況下,這不僅是一個表現的問題。謝謝! – Voo 2012-02-26 19:07:31

8

更一般地,在many valued logic系統中,equalsnot equals不一定彼此精確相反。

明顯的例子是SQL,其中True == True,False == FalseNull != Null。雖然我不知道是否有任何特定的Python示例,但我可以想象它是在某些地方實現的。

+1

而在MYSQL中,你甚至可以同時擁有'NULL'和'NOT NULL'的值!!! 1! (儘管我認爲這是MySQL的一個設計錯誤) – 2012-02-26 20:31:13

相關問題