5 Punkte von GN⁺ 2024-10-14 | 2 Kommentare | Auf WhatsApp teilen
  • 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

 
ilotoki0804 2024-10-15

Wenn Daten häufig von außen im JSON-Format kommen oder aus Python heraus exportiert werden, ist es sinnvoll, TypedDict zu verwenden; andernfalls empfehle ich strukturierte dataclass oder NamedTuple.

 
GN⁺ 2024-10-14
Hacker-News-Kommentare
  • Menschen, die dynamische Typisierung bevorzugen, erkennen zunehmend die Bedeutung von Typsystemen

    • Ein besseres Typsystem ist einem schlechteren überlegen
  • Gründe, dataclass(slots=True) statt TypedDict zu verwenden

    • Der Zugriff auf Attribute ist schneller, dadurch läuft der Code schneller
    • Slot-Klassen benötigen weniger RAM und erzeugen weniger Druck auf den L1-Cache, wodurch der Code schneller wird
    • Beim Attributzugriff verwendet man .foobar statt ["foobar"], was das Handgelenk weniger belastet
    • Wenn man sich beim Attributnamen vertippt, entsteht ein Laufzeitfehler
  • Ohne ein System, das Typen erzwingt, erfüllt TypedDict keinerlei Funktion

    • Selbst wenn man versehentlich Mist in eine als String annotierte Eigenschaft speichert, verhindert oder warnt Standard-Python nicht davor
    • Um Typen tatsächlich zu erzwingen, muss man Tools wie Pydantic verwenden
  • Der Titel "thank you think" klingt übertrieben unhöflich

    • "than i thought" liest sich besser
  • In dem Satz zum Abonnement ist die Bedeutung von "None" unklar

    • Die Grammatik ist zu komplex und daher schwer zu verstehen
  • Persönliche Erfahrungen mit TypedDict

    • Zur besseren Lesbarkeit des Codes wurden dicts mit TypedDict annotiert
    • Dadurch musste weniger Zeit darauf verwendet werden, Code-Pfade nachzuverfolgen
    • Bessere Programmierfähigkeiten wären wünschenswert, aber in Apps, die viele dicts verwenden, ist es eine gute Lösung
  • Die Funktionalität von TypedDict ist gut, aber die Deklarationssyntax ist kompliziert