2015-01-05 128 views
-1

對於不同類型對象的排序,建議的Python語義是什麼?換句話說,當自定義編寫的比較方法(使用rich comparisons,例如__lt__,但也許在Python 2中使用'poor'比較__cmp__)遇到與self不同類型的對象時,應該執行什麼行爲?不同類型對象的比較

  1. 如果人們發明了訂單,例如, 「所有意外的對象都比我自己的類型少」?
  2. 應該拋出一個TypeError
  3. 是否有一些簡單的方法讓其他對象有一個嘗試,即如果有一個foo < barfoo.__lt__不知道bar的類型,它可以回落到bar.__gt__
  4. 是否有任何關於如何實現不同類型對象的正確排序的指導方針,最好是total order但可能更少?
  5. 在文檔中是否有任何部分解釋了爲什麼3 < "3"

PEP 207顯然留下了很多的東西怎麼能實現自由的,但儘管如此,我預計可能會有一些指導如何事情應該實施幫助的互操作性。

回答

0

寫這個問題時,「類似問題」列表讓我意識到this post。它提到NotImplemented作爲返回值(沒有例外)的富比較。搜索此關鍵字的文檔打開了相關的部分,以及:

Python 2 data model

NotImplemented - 這種類型有一個值。有這個值的單個對象。該對象通過內置名稱NotImplemented訪問。如果數字方法和豐富的比較方法沒有對提供的操作數執行操作,則可能會返回該值。 (解釋者然後會根據操作員嘗試反射的操作或其他一些後備操作。)它的真值是正確的。

而且later on

豐富的比較方法可能返回單NotImplemented如果不實施一對給定參數的操作。按照慣例,返回FalseTrue以成功比較。但是,這些方法可以返回任何值,所以如果在布爾上下文中使用比較運算符(例如,在if語句的條件下),Python將調用bool()來確定結果是true還是false。

PEP 207

如果函數不能比較對象的特定組合,它應該返回一個新的參考Py_NotImplemented

這回答了我原來的問題的第2點和第3點,至少對於豐富的比較場景。 __cmp__的文檔根本沒有提及NotImplemented,這可能是我一開始就錯過了這個的原因。所以這是改變富比較的另一個理由。

我還不確定返回該值是否會比發明訂單更受歡迎。我想很多取決於其他對象可能有什麼想法。我擔心,爲了實現任何種類的理智排序,可能需要大量的合作。但也許別人可以在我的問題的其他部分闡明更多的信息。