Syntax
object.__rsub__(self, other)
The Python __rsub__()
method implements the reverse subtraction operation that is subtraction with reflected, swapped operands. So, when you call x - y
, Python attempts to call x.__sub__(y)
. Only if the method is not implemented on the left operand, Python attempts to call __rsub__
on the right operand and if this isn’t implemented either, it raises a TypeError
.
We call this a “Dunder Method” for “Double Underscore Method” (also called “magic method”). To get a list of all dunder methods with explanation, check out our dunder cheat sheet article on this blog.
Python __sub__ vs __rsub__
Say, you want to calculate the -
operation on two custom objects x
and y
:
print(x - y)
Python first tries to call the left object’s __sub__()
method x.__sub__(y)
. But this may fail for two reasons:
- The method
x.__sub__()
is not implemented in the first place, or - The method
x.__sub__()
is implemented but returns aNotImplemented
value indicating that the data types are incompatible.
If this fails, Python tries to fix it by calling the y.__rsub__()
for reverse subtraction on the right operand y
.
If the reverse subtraction method is implemented, Python knows that it doesn’t run into a potential problem of a non-commutative operation. If it would just execute y.__sub__(x)
instead of x.__sub__(y)
, the result would be wrong because the operation may be non-commutative when defined as a custom operation. That’s why y.__rsub__(x)
is needed.
So, the difference between x.__sub__(y)
and x.__rsub__(y)
is that the former calculates x - y
whereas the latter calculates y - x
— both calling the respective method defined on the object x
.
You can see this in effect here where we attempt to call the operation on the left operand x
—but as it’s not implemented, Python simply calls the reverse operation on the right operand y
.
class Data_1: pass class Data_2: def __rsub__(self, other): return 'called reverse -' x = Data_1() y = Data_2() print(x - y) # called reverse -
References: