False positive "unsafe[] overlapping" for _floordiv__/__rfloordiv__ with Real argument, but nearly identical signatures for other operators are fine
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.
Did you ever find a fix for this? I ran into the same exact issue with my code, which is structured similarly to yours. In particular, I get the issue if I use numbers.Rational in the signature for __floordiv__ and __rfloordiv__, but not any other arithmetic operation.
I suspect this is because numbers.pyi in typeshed declares Real.__rfloordiv__ as returning int, but Real.__rmul__ returns Any. I'm not sure how this should be fixed though.
As of https://github.com/python/mypy/pull/17392 the overlapping is gone. However, in the time since, this has gained an LSP error. I still think the issue can be closed?