2016-12-05 10 views
17

私は、これらの演算子のためのマジックメソッドを使ってブールバイナリ演算を行いたいと思います。たとえば、a < bgetattr(a, '__lt__')(b)またはa == bとしてgetattr(a, '__eq__')(b)とすることができます。演算子 "is"と "in"のマジックメソッドの名前は何ですか?

このようにしてa in ba is bを入手できますか?

答えて

16

in__contains__であり、isはダンダー法を有していない。私は強くあなたがoperator moduleで関数を使用することをお勧め:__contains____iter____getitem__されて定義されていない場合

a < b => operator.lt(a, b) 
a == b => operator.eq(a, b) 
a in b => operator.contains(a, b) 
a is b => operator.is_(a, b) 
+0

なぜ、 'operator'モジュールが通常の方法よりも好ましいでしょうか? –

+0

演算子の関数バージョンが必要な場合は、演算子モジュールがdunderメソッドにアクセスしたり、独自のラッパーを記述したりするのが望ましいです。 –

+3

'getattr(a、 '__lt __')(b)'を 'a

26

inの場合、正しいダンダー法は__contains__です。

isの方法はありません。これはid(a) == id(b)に相当するためです。それはPythonによってフードの下で使用される実際のオブジェクトIDを比較します。したがって、オブジェクトの内容ではなくオブジェクトのIDを比較するために使用されます。クラス内で上書きすると、Pythonのオブジェクトモデルが破損するため、許可されません。

1

__contains__は、フォールバックオプションで、inの正しいです。

にはgetattrを使用する必要があるのはなぜか分かりません。 isのために "定義されています"すべてオブジェクトはPythonで定義されています。 operator._isまたは(試行錯誤)getattrを通過する必要はありません。

See the documentation on built-in types

isis notオペレータの挙動がカスタマイズすることができません。 これらはいずれかの2つのオブジェクトに適用でき、例外は発生しません。

(重点鉱山)

だけの機能をつかむと、getattr(a, "function")(b)を使用してそれを呼び出すあなたが提供するスニペットによると、あなたはすでにあなたが評価する必要があるオブジェクトの名前を持っている、ちょうどisを使用すぐに;常に利用可能です。

関連する問題