First overload picked overeagerly when overloading on self type
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Consider this example:
from typing import Generic, TypeVar, Any, overload
AnyStr = TypeVar("AnyStr", str, bytes)
class Popen(Generic[AnyStr]):
@overload
def communicate(self: Popen[str], buf: str = ...) -> float: ...
@overload
def communicate(self: Popen[bytes], buf: memoryview | bytes = ...) -> range: ...
def communicate(self, buf: object = None) -> Any: raise NotImplementedError
p = Popen()
reveal_type(p.communicate())
This currently reveals float. I think it should either be the union float | range or Any. This came up in python/typeshed#9100.
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 mit dem bereitgestellten Generic[Popen]-Beispiel und reproduziere den für communicate() ermittelten Typ. Verfolge die Auflösung von Overloads für Methoden, die anhand des self-Typs überladen sind, und vergleiche anschließend das Ergebnis mit dem erwarteten Verhalten float | range oder Any. Erledigt ist die Aufgabe, wenn das Beispiel nicht mehr nur float ermittelt und eine Regressionstestabdeckung das korrigierte Verhalten schützt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100