◐ Shell
clean mode source ↗

Issue 3178: __radd__(self,other) isn't called if self and other are of the same class

>>> class test: 
... 	def __radd__(self,other):
... 		return '__radd__ called'
... 
>>> t = test()
>>> 1 + t
'__radd__ called'
>>> t + t
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'test' and 'test'


This applies to all of the reflected operations.
This is covered in section 3.4.7 of Python Reference Manual:
__radd__(self, other)
[skipped]
    These methods are called to implement the binary arithmetic
operations (+, -, *, /, %, divmod(), pow(), **, <<, >>, &, ^, |) with
reflected (swapped) operands. These functions are only called if the
left operand does not support the corresponding operation and the
operands are of different types.[3.3] For instance, to evaluate the
expression x-y, where y is an instance of a class that has an __rsub__()
method, y.__rsub__(x) is called if x.__sub__(y) returns NotImplemented. 
[3.3] For operands of the same type, it is assumed that if the
non-reflected method (such as __add__()) fails the operation is not
supported, which is why the reflected method is not called.