2012-09-12 71 views
1

Python 3如何將內置對象(在lhs上)與用戶定義的對象(在rhs上)進行比較?內置和用戶定義類型之間的Python比較

內置__eq__方法是否簡單地將比較委託給rhs(rhs.__eq__(self))?

我在文檔中沒有發現任何關於此的聲明。 docs狀態:

不同類型的對象,除了不同的數字類型,永遠不會比較相等。

這是很誤導,因爲:

class X: 
    def __eq__(self, rhs) 
    return True 

x = X() 
'abc' == x # True 

我認爲DOC聲明應作如下改寫:不同的內置類型,但不同的數字類型的

對象,根本不比較等於。

和應進一步闡明如何進行比較用戶定義的類的實例。

+0

我把你的有關措辭點,但說句公道話,該部分被稱爲該documentation on the __eq__ protocol「內建類型「,第一句是」以下部分描述瞭解釋器中內置的標準類型「。其他句子,比如「任何對象都可以測試真值」,也假設你沒有定義「def __bool __(self):raise Exception」或其他東西。 – DSM

+0

@DSM是的,我在二讀時意識到了這一點。事情是,很多人只是從文檔中摘錄短片;這段文字的正確解釋所需的上下文數量遠遠超出了我的正常關注範圍! – max

回答

3

要回答的問題:

怎樣的Python 3比內置的對象(上左)到用戶定義的對象(上右)?

與任何其他對象比較(包括None!)相同的方式。

內置__eq__方法是否簡單地將比較委託給rhs(rhs.__eq__(self))?

號內置__eq__代表這樣。在工作中有一個更高級的構造,涵蓋Python中==的行爲。

鑑於a == b,其中a.__eq__(b)返回NotImplemented然後b.__eq__(a)將被調用和用作平等測試的結果的結果。 (如果兩個__eq__實現返回NotImplementedFalse被返回。)

因此,給定x(的X類),並且考慮到"abc".__eq__(x)返回NotImplemented,然後x.__eq__("abc")被調用(和計算結果爲每True的問題)。

這同樣適用於其他標準比較運算符。

雖然我不在乎猜測的文件(或可能的不當措辭),就太多了,我認爲這是完全正確如果採取的stdObj.__eq__(obj)背景下,而不是stdObj == obj

參見:

+0

謝謝..小的一點,但我認爲委託(即返回'rhs .__ eq __(self)')與返回NotImplemented具有相同的效果,不是嗎? – max

+0

@max我只是在回家的路上想這件事。儘管在這種情況下可能在語義上是等價的,但它不適用於lhs是沒有這種委託 - '_eq__'實現的自定義類型,並且它可能會導致無限遞歸的情況,如果不是寫在非常(1).__ eq __(「x」)'和'「x」.__ eq __(1)''評估爲'NotImplemented',例如。 – 2012-09-12 01:56:07

+0

是的,我只是想具體案例 - 總的來說,基於NotImplemented的機制非常有用。 – max