python / python/mypy

Calls to `.get` on TypeVars bound to TypedDict narrow to `object`

Offen
#16,872 2 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug
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

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Ö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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.