Missing TypeIs narrowing with covariant generic
Offen
Dieses Issue hat noch niemand übernommen.
bug
topic-type-narrowing
topic-typeguard-typeis
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Mypy fails to narrow away an Any-specialized covariant generic after TypeIs narrowing to its object specialization:
from typing import Any, Generic, TypeVar
from typing_extensions import TypeIs
T_co = TypeVar("T_co", covariant=True)
class Source(Generic[T_co]): ...
def is_source(x: object) -> TypeIs[Source[object]]:
return False
def f(x: int | Source[Any]) -> None:
assert not is_source(x)
reveal_type(x) # expect int, mypy reveals int | Source[Any]
In contrast this does work correctly with an analogous contravariant type:
from typing import Any, Generic, TypeVar
from typing_extensions import Never, TypeIs
T_contra = TypeVar("T_contra", contravariant=True)
class Sink(Generic[T_contra]): ...
def is_sink(x: object) -> TypeIs[Sink[Never]]:
return False
def f(x: int | Sink[Any]) -> None:
assert not is_sink(x)
reveal_type(x) # int
(Found in python/typeshed#15931.)
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
Verwende das minimale Python-Snippet im Issue als Reproducer und vergleiche anschließend die Eingrenzung von kovariantem Source[Any] mit dem funktionierenden kontravarianten Sink[Never]-Fall. Erledigt ist die Aufgabe, wenn reveal_type(x) nach assert not is_source(x) int ist und dabei das bestehende Verhalten von Sink erhalten bleibt.
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
- Ruhig
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 50/100