私は小さなヘルパークラスを持っています:
class AnyOf(object):
def __init__(self, *args):
self.elements = args
def __eq__(self, other):
return other in self.elements
これにより、次のような甘い魔法を実行できます。
>>> arr = np.array([1,2,3,4,5])
>>> arr == AnyOf(2,3)
np.array([False, True, True, False, False])
( のように) リスト内包表記を使用する必要はありませnp.array(x in (2,3) for x in arr
ん。
(私は、(信頼できる) ユーザーが任意のコードを入力できるようにする UI を維持しており、a == AnyOf(1,2,3)
技術に詳しくないユーザーにとっては、リストの理解よりもはるかに受け入れやすいものです。)
でも!
これは一方向にしか機能しません。たとえば、AnyOf(2,3) == arr
そうすると、AnyOf
クラスの__eq__
メソッドが呼び出されることはありません。代わりに、NumPy 配列のメソッドが呼び出され、内部的に (推測すると思いますが)そのすべての要素の__eq__
メソッドが呼び出されます。__eq__
これは私を疑問に思いました: なぜ Python は右辺の同等物を許可しないの__eq__
ですか? __radd__
( 、 などのメソッドとほぼ同等__rmul__
です。)