I have a little helper class:
class AnyOf(object):
def __init__(self, *args):
self.elements = args
def __eq__(self, other):
return other in self.elements
This lets me do sweet magic like:
>>> arr = np.array([1,2,3,4,5])
>>> arr == AnyOf(2,3)
np.array([False, True, True, False, False])
without having to use a list comprehension (as in np.array(x in (2,3) for x in arr
).
(I maintain a UI that lets (trusted) users type in arbitrary code, and a == AnyOf(1,2,3)
is a lot more palatable than a list comprehension to the non-technically savvy user.)
However!
This only works one way! For example, if I were to do AnyOf(2,3) == arr
then my AnyOf
class's __eq__
method never gets called: instead, the NumPy array's __eq__
method gets called, which internally (I would presume) calls the __eq__
method of all its elements.
This lead me to wonder: why does Python not allow a right-sided equivalent to __eq__
? (Roughly equivalent to methods like __radd__
, __rmul__
, et cetera.)