Faulty type narrowing with value restrictions
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
When passing an empty list directly into a value restricted generic function, the inferred return type can end up being too narrow.
To Reproduce
from typing import TypeVar
TV = TypeVar("TV", str, int)
def foo(x: list[TV]) -> list[TV]:
return x
# Should be: builtins.list[builtins.str] | builtins.list[builtins.int]
reveal_type(foo([])) # "builtins.list[builtins.str]"
https://mypy-play.net/?mypy=latest&python=3.10&flags=strict&gist=129ba2fed0c6ba1a861149f944db3420
Expected Behavior
I would expect the revealed type to either be builtins.list[builtins.str] | builtins.list[builtins.int].
Alternatively, having this result in an error of some sort would be fine. As a reference, when assigning the empty list first, it becomes a list[Any] instead of a list[<nothing>]. This results in the revealed type being list[Any], but also an error along the lines of Need type annotation for "l" (hint: "l: List[<type>] = ...").
Actual Behavior
The revealed type was builtins.list[builtins.str]
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 verknüpften mypy-play-Reproduzierer und verfolge die Behandlung leerer Listenargumente bei der Inferenz eines wertbeschränkten TypeVar. Vergleiche den abgeleiteten Typ mit der erwarteten Union und dem im Issue beschriebenen akzeptablen Diagnoseverhalten. Erledigt ist es, wenn das Beispiel nicht mehr fälschlicherweise auf list[str] eingeengt wird.
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
- Klar beschrieben
- Anfängerfreundlichkeit
- 45/100