Incorrect widening of `T | None` with unions to `builtins.object` in generic functions
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
Generic function with signature (fun: Callable[[], T | None]) -> T | None has its type incorrectly widened to builtins.object when T is a union type
To Reproduce
import typing
T = typing.TypeVar("T")
def gen_fun_one(fun: typing.Callable[[], T | int]) -> T | int:
return fun()
def gen_fun_two(fun: typing.Callable[[], T | None]) -> T | None:
return fun()
def foo() -> int | str | None:
pass
typing.reveal_type(gen_fun_one(foo)) # Union[builtins.str, None, builtins.int]
typing.reveal_type(gen_fun_two(foo)) # builtins.object
Gist URL: https://gist.github.com/mypy-play/f2401bd493520f4c72cad4a416195e19
Playground URL: https://mypy-play.net/?mypy=latest&python=3.12&gist=f2401bd493520f4c72cad4a416195e19
Expected Behavior
Both gen_fun_one(foo) and gen_fun_two(foo) are of type str | int | None
Actual Behavior
Function gen_fun_two(foo) is of type builtins.object
Your Environment
- Mypy version used: 1.9.0
- Python version used: 3.12
- Default Mypy playground settings
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
Führe zunächst die bereitgestellte Python-Reproduktion im verlinkten mypy playground aus und vergleiche die reveal_type-Ergebnisse für gen_fun_one und gen_fun_two. Verfolge die an der zweiten Aufrufstelle stattfindende Inferenz der generischen Union; die Arbeit ist abgeschlossen, wenn str | int | None statt builtins.object inferiert wird und eine Abdeckung für den gemeldeten Fall vorhanden ist.
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
- 44/100