@property returning descriptor instance triggers false positive
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
🐛 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:
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
Expected Behavior
Accessing crashing_property shouldn't cause an error.
Actual Behavior
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"]):
...
Your Environment
- Mypy version used: 0.782, 0.800, 0.812, 0.910
- Mypy command-line flags: None
- Mypy configuration options from
mypy.ini(and other config files): None, using all defaults - Python version used: CPython 3.7.7, 3.8.6, 3.9.1
- Operating system and version: Ubuntu 20.04, MacOS 11.1 (Big Sur)
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, den bereitgestellten Python-Reproducer mit MyPys Standardeinstellungen auszuführen, und bestätige den falsch-positiven Overload-Fehler beim Property-Zugriff. Die Arbeit ist abgeschlossen, wenn dieser Zugriff validiert wird, ohne einen zusätzlichen get-Overload für Field-Instanzen zu erfordern, während das bestehende Deskriptorverhalten weiterhin gültig bleibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100