次のクラス定義を検討してください。
class Symbolic(object):
def __eq__(self, rhs):
return Symbolic()
def __le__(self, rhs):
return Symbolic()
def __gt__(self, rhs):
return Symbolic()
def __contains__(self, other):
return Symbolic()
クラスで定義された操作は次のように動作します。
x = Symbolic()
y = Symbolic()
x == y --> <Symbolic object at ...>
x <= y --> <Symbolic object at ...>
x > y --> <Symbolic object at ...>
y in x --> True # huh?
タイトルによると、私の質問は次のとおりです。Python ランタイムがin
演算子の出力をブール型に==
明示的に強制するのはなぜですか?<=
>
編集:ドキュメントでは、in
演算子と豊富な比較についてそれぞれ次のように述べています。
__contains__()
メソッドを定義するユーザー定義クラスの場合、x in y
が true の場合にのみtrue になりy.__contains__(x)
ます。慣例により、比較が成功すると False と True が返されます。ただし、これらのメソッドは任意の値を返すことができるため、比較演算子がブール コンテキスト (if ステートメントの条件など) で使用されている場合、Python は値に対して bool() を呼び出して、結果が true か false かを判断します。 .
問題はまだ残っています: なぜ区別が必要なのですか?