私は、これらの演算子のためのマジックメソッドを使ってブールバイナリ演算を行いたいと思います。たとえば、a < b
をgetattr(a, '__lt__')(b)
またはa == b
としてgetattr(a, '__eq__')(b)
とすることができます。演算子 "is"と "in"のマジックメソッドの名前は何ですか?
このようにしてa in b
とa is b
を入手できますか?
私は、これらの演算子のためのマジックメソッドを使ってブールバイナリ演算を行いたいと思います。たとえば、a < b
をgetattr(a, '__lt__')(b)
またはa == b
としてgetattr(a, '__eq__')(b)
とすることができます。演算子 "is"と "in"のマジックメソッドの名前は何ですか?
このようにしてa in b
とa is b
を入手できますか?
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)
in
の場合、正しいダンダー法は__contains__
です。
is
の方法はありません。これはid(a) == id(b)
に相当するためです。それはPythonによってフードの下で使用される実際のオブジェクトIDを比較します。したがって、オブジェクトの内容ではなくオブジェクトのIDを比較するために使用されます。クラス内で上書きすると、Pythonのオブジェクトモデルが破損するため、許可されません。
__contains__
は、フォールバックオプションで、in
の正しいです。
にはgetattr
を使用する必要があるのはなぜか分かりません。 is
はのために "定義されています"すべてオブジェクトはPythonで定義されています。 operator._is
または(試行錯誤)getattr
を通過する必要はありません。
See the documentation on built-in types:
is
とis not
オペレータの挙動がカスタマイズすることができません。 これらはいずれかの2つのオブジェクトに適用でき、例外は発生しません。
(重点鉱山)
だけの機能をつかむと、getattr(a, "function")(b)
を使用してそれを呼び出すあなたが提供するスニペットによると、あなたはすでにあなたが評価する必要があるオブジェクトの名前を持っている、ちょうどis
を使用すぐに;常に利用可能です。
なぜ、 'operator'モジュールが通常の方法よりも好ましいでしょうか? –
演算子の関数バージョンが必要な場合は、演算子モジュールがdunderメソッドにアクセスしたり、独自のラッパーを記述したりするのが望ましいです。 –
'getattr(a、 '__lt __')(b)'を 'a