Calls to `.get` on TypeVars bound to TypedDict narrow to `object`
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 using dict.get to access specific members of TypeVar entries bound to TypedDict, mypy always narrows the type to object where, without the TypeVar, we expect the union of the underlying type and None.
To Reproduce
from typing import TypedDict, TypeVar
class MyDict(TypedDict):
my_attributes: list[str]
def take_my_dict(d: MyDict):
reveal_type(d['my_attributes'])
reveal_type(d.get('my_attributes'))
MyDictT = TypeVar('MyDictT', bound=MyDict)
def take_my_typevar(d: MyDictT):
reveal_type(d['my_attributes'])
reveal_type(d.get('my_attributes'))
Expected Behavior
main.py:7: note: Revealed type is "builtins.list[builtins.str]"
main.py:8: note: Revealed type is "Union[builtins.list[builtins.str], None]"
main.py:13: note: Revealed type is "builtins.list[builtins.str]"
main.py:14: note: Revealed type is "Union[builtins.list[builtins.str], None]"
Actual Behavior
main.py:7: note: Revealed type is "builtins.list[builtins.str]"
main.py:8: note: Revealed type is "Union[builtins.list[builtins.str], None]"
main.py:13: note: Revealed type is "builtins.list[builtins.str]"
=> main.py:14: note: Revealed type is "builtins.object"
Your Environment
- Mypy version used: 1.8.0
- Mypy command-line flags: n/a
- Mypy configuration options from
mypy.ini(and other config files): n/a - Python version used: 3.12
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 Reproducer main.py und führe mypy für die TypedDict- und TypeVar-Fälle aus, wobei du die reveal_type-Ausgabe für .get vergleichst. Verfolge den Typprüfpfad für einen .get-Aufruf bei einem an TypedDict gebundenen TypeVar; abgeschlossen ist die Aufgabe, wenn der TypeVar-Fall Union[list[str], None] statt object ergibt.
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