Open dargueta opened 4 years ago
Accessing a field implementing the descriptor protocol via a property method causes MyPy to complain that there is no matching overload for __get__().
__get__()
Run MyPy with all default settings on the following code:
from typing import Optional from typing import overload from typing import Type class A: pass class Field: def __init__(self, attr: Optional["Field"] = None): self.attr = attr @property def crashing_property(self) -> Optional["Field"]: return self.attr @overload def __get__(self, instance: None, owner: Type["A"]) -> "Field": ... @overload def __get__(self, instance: "A", owner: Type["A"]) -> Optional["Field"]: ... def __get__(self, instance, owner): if not instance: return self return self.attr f = Field() # type: Field f.attr # Works fine f.crashing_property # Triggers "no overload variant"
n.b. adding __set__() makes no difference
__set__()
Accessing crashing_property shouldn't cause an error.
crashing_property
The last line in the example throws the following error:
test.py:39: error: No overload variant of "__get__" of "Field" matches argument types "Field", "Type[Field]" test.py:39: note: Possible overload variants: test.py:39: note: def __get__(self, instance: None, owner: Type[A]) -> Field test.py:39: note: def __get__(self, instance: A, owner: Type[A]) -> Optional[Field]
If you add this the code validates fine:
@overload def __get__(self, instance: "Field", owner: Type["Field"]): ...
mypy.ini
Update: Still happening as of 0.910.
Still happening with MyPy 1.10.1 on Python 3.12.
🐛 Bug Report
Accessing a field implementing the descriptor protocol via a property method causes MyPy to complain that there is no matching overload for
__get__()
.To Reproduce
Run MyPy with all default settings on the following code:
n.b. adding
__set__()
makes no differenceExpected Behavior
Accessing
crashing_property
shouldn't cause an error.Actual Behavior
The last line in the example throws the following error:
If you add this the code validates fine:
Your Environment
mypy.ini
(and other config files): None, using all defaults