Here is a small repro - class A and B are exactly the same, with the dunder method implemented for the reflected right shift operator. So, x >> y is expected to resolve to y.__rrshift__(x).
class A:
def __init__(self, x):
self.x = x
def __rrshift__(self, other):
return self.__class__(self.x + other.x)
class B:
def __init__(self, x):
self.x = x
def __rrshift__(self, other):
return self.__class__(self.x + other.x)
However, the dunder method doesn't work on instances of the same class.
A(1) >> A(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for >>: 'A' and 'A'
While it works for instances from different classes.
A(1) >> B(2)
<__main__.B object at 0x7f6ca8294f40>
This was pretty surprising. And seems to be common behavior across other reflected operators too (like, radd). Is there a reason this doesn't work?