TypedDict wurde in PEP-589 eingeführt und mit Python 3.8 übernommen. Es wird vor allem verwendet, um Typannotationen für Dictionaries zu erstellen.
- Anstatt
dataclass oder pydantic zu verwenden, um Daten vom Typ „Record“ darzustellen, nutzt TypedDict die Flexibilität von Dictionaries und ist besonders vorteilhaft, wenn Felder fehlen können.
- Zum Beispiel kann man eine Klasse
Movie definieren und der Variablen movie ein Dictionary vom Typ Movie zuweisen.
class Movie(TypedDict):
title: str
movie: Movie = {"title": "Avatar"}
Nicht-Totalität
TypedDict unterstützt das Konzept der Nicht-Totalität, das ausdrückt, dass Felder fehlen können. Das ist nützlich bei der Implementierung von HTTP-PATCH-Endpunkten.
- Bei
dataclass gibt es kein Konzept fehlender Felder, wodurch sich das unnatürlich anfühlen kann.
- In
TypedDict lässt sich der flexible Umgang mit fehlenden Feldern über total=False festlegen.
- PEP-655 ermöglicht es, einzelne Felder mit
Required und NotRequired zu kennzeichnen.
TypedDict als **kwargs verwenden
- PEP-692 erlaubt es, mit
TypedDict variable Keyword-Argumente zu typisieren.
- Mit
TypedDict kann der Code zwar ausführlicher wirken, ist aber nützlich, wenn die Definition in mehreren Funktionen wiederverwendet wird.
- In Kombination mit Nicht-Totalität spielt das seine Stärken noch stärker aus.
- Etwa in Szenarien, in denen man
pytest.fixture anpasst und einige Argumente unverändert weiterreicht.
- Ein ähnliches Verhalten lässt sich auch mit Sentinel-Werten umsetzen, allerdings können die Typannotationen dann sperrig werden.
TypedDict für Dependency Injection verwenden
- PEP-692 ermöglicht Typprüfung bei Funktionsaufrufen, die
TypedDict verwenden.
- Das ist nützlich, wenn viele Ressourcen einige Abhängigkeiten gemeinsam nutzen.
- Dazu definiert man ein
TypedDict, das den kombinierten kwargs aller Ressourcen ähnelt.
- Anschließend schreibt man die Ressourcen so um, dass sie beliebige Argumente akzeptieren, und nutzt
TypedDict für die Dependency Injection.
- Über das Typsystem lassen sich bei der Dependency Injection dann fehlerhafte oder fehlende Argumente prüfen.
- Änderungen an den Ressourcensignaturen sind zwar nicht ideal, aber immer noch ein kleinerer Eingriff als der Einsatz eines Dependency-Injection-Frameworks.
- Viele Frameworks unterstützen keine statische Typprüfung.
Zukünftige Funktionen
- PEP-728 ermöglicht es, den Typ zusätzlicher Einträge zu definieren und geschlossene Dictionaries festzulegen, die keine zusätzlichen Einträge erlauben.
- Das hilft dabei, Record-Typen präziser zu definieren.
- PEP-705 ermöglicht die Kennzeichnung schreibgeschützter Einträge (je nach Zeitpunkt der Veröffentlichung möglicherweise bereits verfügbar).
- Damit lassen sich Situationen adressieren, in denen zwischen verschiedenen
TypedDicts, die intuitiv kompatibel sein sollten, durch potenzielle Mutation oder Löschung Probleme entstehen können.
Zusammenfassung von GN⁺
TypedDict ist vorteilhaft in Situationen, in denen Felder fehlen können, weil es die Flexibilität von Dictionaries nutzt.
TypedDict bietet eine flexiblere Option als andere Datenstrukturen wie dataclass oder pydantic.
- Je nach Anwendungsdomäne sollte man das passende Werkzeug wählen, die Vorteile von
TypedDict aber im Blick behalten.
2 Kommentare
Wenn Daten häufig von außen im JSON-Format kommen oder aus Python heraus exportiert werden, ist es sinnvoll,
TypedDictzu verwenden; andernfalls empfehle ich strukturiertedataclassoderNamedTuple.Hacker-News-Kommentare
Menschen, die dynamische Typisierung bevorzugen, erkennen zunehmend die Bedeutung von Typsystemen
Gründe,
dataclass(slots=True)stattTypedDictzu verwenden.foobarstatt["foobar"], was das Handgelenk weniger belastetOhne ein System, das Typen erzwingt, erfüllt
TypedDictkeinerlei FunktionPydanticverwendenDer Titel "thank you think" klingt übertrieben unhöflich
In dem Satz zum Abonnement ist die Bedeutung von "None" unklar
Persönliche Erfahrungen mit TypedDict
TypedDictannotiertDie Funktionalität von
TypedDictist gut, aber die Deklarationssyntax ist kompliziert