python / python/mypy

Dict unpacking fails when used for building TypedDict with required keys

Offen
#19,467 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-typed-dict
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

When dict unpacking is used to dynamically add optional keys to a TypedDict, mypy raises a typeddict-item error.
As dict unpacking is used to fill some keys from the TypedDict, my understanding is that mypy could validate the unpacked dictionaries considering all keys as NotRequired, and only the final TypedDict respecting its formal definition.

To Reproduce

Gist: https://mypy-play.net/?mypy=latest&python=3.13&gist=b3377281f7f5a6f83dd9962d60302827

from typing import NotRequired, TypedDict


class Project(TypedDict):
    name: str
    version: NotRequired[str]


def build_project(name: str, version: str | None = None) -> Project:
    return {
        "name": name,
        **({"version": version} if version is not None else {})
    }

Actual Behavior

$ mypy .
main.py:12: error: Missing key "name" for TypedDict "Project"  [typeddict-item]
Found 1 error in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: 1.17.0
  • Mypy command-line flags: N/A
  • Mypy configuration options from mypy.ini (and other config files): N/A
  • Python version used: 3.13.5

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

Beginnen Sie mit der verlinkten mypy-play-Reproduktion und führen Sie das gezeigte Beispiel unter Python 3.13 aus. Lesen Sie die von diesem Fall erreichte Verarbeitung von TypedDict und dict-unpacking und fügen Sie anschließend einen Regressionstest für den gemeldeten Fehler hinzu. Erledigt ist die Aufgabe, wenn das Beispiel den erforderlichen Schlüssel "name" und das optional entpackte "version" ohne einen typeddict-item-Fehler akzeptiert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
tooling
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

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