a - b
isn’t just a.__sub__(b)
. It also tries b.__rsub__(a)
if a
can’t handle the operation, and in the 1 - 2.
case, it’s the float’s __rsub__
that handles the operation.
>>> (2.).__rsub__(1)
-1.0
You ran a.__rsub__(2.)
, but that’s the wrong __rsub__
. You need the right-side operand’s __rsub__
, not the left-side operand.
There is no implicit type conversion built into the subtraction operator. float.__rsub__
has to handle ints manually. If you want type conversion in your own operator implementations, you’ll have to handle that manually too.