2015-12-14 107 views
1

比較我發現下面的Python代碼here古典與豐富的Python

def cmp_lt(x, y): 
    # Use __lt__ if available; otherwise, try __le__. 

    # In Py3.x, only __lt__ will be called. 

    return (x < y) if hasattr(x, '__lt__') else (not y <= x) 

我真的不明白這個函數所做的事情。顯然我在這裏錯過了一個微妙之處,因爲我沒有得到x<ynot y<=x之間的差別,並且在這兩個語句的設置下,這兩個語句會返回不同的結果,更不用說爲什麼我們需要考慮這一點。經過谷歌搜索,我知道__lt____le__與豐富的比較有關,但就是這樣。

+0

代碼中的註釋應該是相當豐富的 –

回答

2

我不明白x<y怎麼可能在不同not y<=x

實在不行,其實這是完全一樣的。

的事情是,如果x是沒有覆蓋__lt__然後x < y將失敗的類的實例(這就是爲什麼有if hasattr(x, '__lt__'))。在這種情況下,不會評估x < y它會嘗試評估not y <= x

+0

謝謝,但爲什麼'如果x是一個類沒有重寫__lt__然後x Antoine

+0

@Antoine請參閱http://www.rafekettler.com/magicmethods.html#comparisons – DeepSpace

+0

謝謝。因此,我們似乎在研究定義比較運算符行爲的方法。例如,我可能希望根據單詞的長度來比較單詞,而不是基於字母表中字母的順序,並相應地爲單詞更改比較運算符的行爲。好的,我明白了。所以只要我確定x和y總是數字,我就可以安全地使用'<和'<='來保持身材? – Antoine