1

Python 3は、組み込みオブジェクト(lhs上)をユーザー定義オブジェクト(rhs上)とどのように比較しますか?

組み込みの__eq__メソッドは、単に比較をrhs(rhs.__eq__(self))に委任しますか?

ドキュメントにこれに関する記述は見つかりませんでした。ドキュメントの状態:

異なる数値タイプを除いて、異なるタイプのオブジェクトは決して等しく比較されません。

それはかなり誤解を招く理由です:

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

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

docステートメントは次のように言い換えるべきだと思います。

異なる数値タイプを除いて、異なる組み込みタイプのオブジェクトは、等しく比較されることはありません。

さらに、ユーザー定義のクラスインスタンスとの比較がどのように実行されるかを明確にする必要があります。

4

1 に答える 1

3

質問に答えるには:

Python 3は、組み込みオブジェクト(lhs上)をユーザー定義オブジェクト(rhs上)とどのように比較しますか?

他のオブジェクト比較(!を含む)と同じ方法Noneです。

組み込みの__eq__メソッドは、単に比較をrhs(rhs.__eq__(self))に委任しますか?

いいえ。ビルトインはこのように委任し__eq__ません。==Pythonでの動作をカバーする、より高度な構造が機能しています。

が与えられるとa == b、ここでa.__eq__(b) returns NotImplementedが呼び出され、そのb.__eq__(a)結果が等価性テストの結果として使用されます。(False両方の__eq__実装が返される場合に返されNotImplementedます。)

したがって、x(クラスのX)given、および"abc".__eq__(x) returnsが NotImplemented与えられた場合、次にx.__eq__("abc")呼び出されます(そしてTrue質問ごとに評価されます)。

同じことが他の標準比較演算子にも当てはまります。

ドキュメント(または誤解の可能性)についてあまり推測する必要はありませんが、とは対照的に、コンテキストで解釈すると完全に正確であると思います。stdObj.__eq__(obj)stdObj == obj

参照:

于 2012-09-12T00:59:25.293 に答える