mypy icon indicating copy to clipboard operation
mypy copied to clipboard

False positive "unsafe[] overlapping" for _floordiv__/__rfloordiv__ with Real argument, but nearly identical signatures for other operators are fine

Open posita opened this issue 4 years ago • 3 comments

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.

posita avatar Jul 02 '21 02:07 posita

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.

ethanscorey avatar Feb 16 '22 00:02 ethanscorey

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.

JelleZijlstra avatar Feb 16 '22 00:02 JelleZijlstra

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?

A5rocks avatar Jun 27 '24 02:06 A5rocks