Bug Report
Where the single argument to __floordiv__/__rfloordiv__ includes numbers.Real, it results in (what I think is) a false Signatures … are unsafely overlapping error.
To Reproduce
# test_case.py
from numbers import Real
from operator import floordiv, mul, truediv
from typing import NamedTuple, Union
_OperandT = Union[float, Real]
# _OperandT = Real # <- results in the same error
# _OperandT = float # <- this works
class Spam(NamedTuple):
value: _OperandT
def __floordiv__(self, other: _OperandT) -> "Spam":
return Spam(floordiv(self.value, other))
def __rfloordiv__(self, other: _OperandT) -> "Spam": # <- this presents an error …
return Spam(floordiv(other, self.value))
def __mul__(self, other: _OperandT) -> "Spam":
return Spam(mul(self.value, other))
def __rmul__(self, other: _OperandT) -> "Spam": # <- … but this is just fine …
return Spam(mul(other, self.value))
def __truediv__(self, other: _OperandT) -> "Spam":
return Spam(truediv(self.value, other))
def __rtruediv__(self, other: _OperandT) -> "Spam": # <- … and so is this
return Spam(truediv(other, self.value))
Actual Behavior
$ mypy --version
mypy 0.902
$ mypy test_case.py
test_case.py:16: error: Signatures of "__rfloordiv__" of "Spam" and "__floordiv__" of "Union[float, Real]" are unsafely overlapping
Found 1 error in 1 file (checked 1 source file)
Expected Behavior
I would expect symmetry with other binary operator signatures. I'm also pretty sure there isn't any actual overlap here, but I could be wrong.