# Einführung in Python-Typen { #python-types-intro }
Python hat Unterstützung für optionale „Typhinweise“ (Englisch: „Type Hints“). Auch „Typ Annotationen“ genannt.
Python hat Unterstützung für optionale „Typhinweise“ (auch "Typannotationen" genannt).
Diese **„Typhinweise“** oder -Annotationen sind eine spezielle Syntax, die es erlaubt, den <abbrtitle="Zum Beispiel: str, int, float, bool">Typ</abbr> einer Variablen zu deklarieren.
Diese **„Typhinweise“** oder -annotationen sind eine spezielle Syntax, die es erlaubt, den <abbrtitle="zum Beispiel: str, int, float, bool">Typ</abbr> einer Variablen zu deklarieren.
Durch das Deklarieren von Typen für Ihre Variablen können Editoren und Tools bessere Unterstützung bieten.
@ -18,7 +18,7 @@ Wenn Sie ein Python-Experte sind und bereits alles über Typhinweise wissen, üb
### Generische Typen mit Typ-Parametern { #generic-types-with-type-parameters }
Es gibt Datenstrukturen, die andere Werte enthalten können, wie etwa `dict`, `list`, `set` und `tuple`. Die inneren Werte können auch ihren eigenen Typ haben.
@ -143,7 +143,7 @@ Diese Typen mit inneren Typen werden „**generische**“ Typen genannt. Es ist
Um diese Typen und die inneren Typen zu deklarieren, können Sie Pythons Standardmodul `typing` verwenden. Es existiert speziell für die Unterstützung dieser Typhinweise.
Die Syntax, welche `typing` verwendet, ist **kompatibel** mit allen Versionen, von Python 3.6 aufwärts zu den neuesten, inklusive Python 3.9, Python 3.10, usw.
@ -157,7 +157,7 @@ Zum Beispiel bedeutet „**Python 3.6+**“, dass das Beispiel kompatibel mit Py
Wenn Sie über die **neueste Version von Python** verfügen, verwenden Sie die Beispiele für die neueste Version, diese werden die **beste und einfachste Syntax** haben, zum Beispiel, „**Python 3.10+**“.
#### Liste
#### Liste { #list }
Definieren wir zum Beispiel eine Variable, die eine `list` von `str` – eine Liste von Strings – sein soll.
@ -195,7 +195,7 @@ Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckige
////
/// tip | Tipp
/// info | Info
Die inneren Typen in den eckigen Klammern werden als „Typ-Parameter“ bezeichnet.
@ -221,7 +221,7 @@ Beachten Sie, dass die Variable `item` eines der Elemente in der Liste `items` i
Und trotzdem weiß der Editor, dass es sich um ein `str` handelt, und bietet entsprechende Unterstützung.
#### Tupel und Menge
#### Tupel und Menge { #tuple-and-set }
Das Gleiche gilt für die Deklaration eines Tupels – `tuple` – und einer Menge – `set`:
@ -246,7 +246,7 @@ Das bedeutet:
* Die Variable `items_t` ist ein `tuple` mit 3 Elementen, einem `int`, einem weiteren `int` und einem `str`.
* Die Variable `items_s` ist ein `set`, und jedes seiner Elemente ist vom Typ `bytes`.
#### Dict
#### Dict { #dict }
Um ein `dict` zu definieren, übergeben Sie zwei Typ-Parameter, getrennt durch Kommas.
@ -276,7 +276,7 @@ Das bedeutet:
* Die Schlüssel dieses `dict` sind vom Typ `str` (z. B. die Namen der einzelnen Artikel).
* Die Werte dieses `dict` sind vom Typ `float` (z. B. der Preis jedes Artikels).
#### <abbrtitle="Union – Verbund, Einheit‚ Vereinigung: Eines von Mehreren">Union</abbr>
#### <abbrtitle="Union – Verbund, Einheit‚ Vereinigung: Eines von Mehreren">Union</abbr> { #union }
Sie können deklarieren, dass eine Variable einer von **verschiedenen Typen** sein kann, zum Beispiel ein `int` oder ein `str`.
@ -302,13 +302,15 @@ In Python 3.10 gibt es zusätzlich eine **neue Syntax**, die es erlaubt, die mö
In beiden Fällen bedeutet das, dass `item` ein `int` oder ein `str` sein kann.
#### Vielleicht `None`
#### Vielleicht `None` { #possibly-none }
Sie können deklarieren, dass ein Wert ein `str`, aber vielleicht auch `None` sein kann.
In Python 3.6 und darüber (inklusive Python 3.10) können Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden.
Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen könnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein könnte.
@ -340,7 +342,7 @@ Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden können:
////
#### `Union` oder `Optional` verwenden?
#### `Union` oder `Optional` verwenden? { #using-union-or-optional }
Wenn Sie eine Python-Version unterhalb 3.10 verwenden, hier ist mein sehr **subjektiver** Standpunkt dazu:
@ -375,7 +377,7 @@ Die gute Nachricht ist, dass Sie sich darüber keine Sorgen mehr machen müssen,
Und dann müssen Sie sich nicht mehr um Namen wie `Optional` und `Union` kümmern. 😎
#### Generische Typen
#### Generische Typen { #generic-types }
Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generische Typen** oder **Generics** genannt.
@ -427,7 +429,7 @@ Verwenden Sie für den Rest, wie unter Python 3.8, das `typing`-Modul:
////
### Klassen als Typen
### Klassen als Typen { #classes-as-types }
Sie können auch eine Klasse als Typ einer Variablen deklarieren.
@ -447,9 +449,9 @@ Beachten Sie, das bedeutet: „`one_person` ist eine **Instanz** der Klasse `Per
Es bedeutet nicht: „`one_person` ist die **Klasse** genannt `Person`“.
## Pydantic Modelle
## Pydantic Modelle { #pydantic-models }
<ahref="https://pydantic-docs.helpmanual.io/"class="external-link"target="_blank">Pydantic</a> ist eine Python-Bibliothek für die Validierung von Daten.
<ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">Pydantic</a> ist eine Python-Bibliothek für die Validierung von Daten.
Sie deklarieren die „Form“ der Daten als Klassen mit Attributen.
@ -485,9 +487,9 @@ Ein Beispiel aus der offiziellen Pydantic Dokumentation:
////
/// info
/// info | Info
Um mehr über <ahref="https://pydantic-docs.helpmanual.io/"class="external-link"target="_blank">Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an</a>.
Um mehr über <ahref="https://docs.pydantic.dev/"class="external-link"target="_blank">Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an</a>.
///
@ -497,11 +499,11 @@ Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial - Benutze
/// tip | Tipp
Pydantic verhält sich speziell, wenn Sie `Optional` oder `Union[Etwas, None]` ohne einen Default-Wert verwenden. Sie können darüber in der Pydantic Dokumentation unter <ahref="https://docs.pydantic.dev/2.3/usage/models/#required-fields"class="external-link"target="_blank">Required fields</a> mehr erfahren.
Pydantic verhält sich speziell, wenn Sie `Optional` oder `Union[Something, None]` ohne einen Default-Wert verwenden. Sie können darüber in der Pydantic Dokumentation unter <ahref="https://docs.pydantic.dev/2.3/usage/models/#required-fields"class="external-link"target="_blank">Required fields</a> mehr erfahren.
///
## Typhinweise mit Metadaten-Annotationen
## Typhinweise mit Metadaten-Annotationen { #type-hints-with-metadata-annotations }
Python bietet auch die Möglichkeit, **zusätzliche Metadaten** in Typhinweisen unterzubringen, mittels `Annotated`.
@ -545,7 +547,7 @@ Und ebenfalls, dass Ihr Code sehr kompatibel mit vielen anderen Python-Tools und
///
## Typhinweise in **FastAPI**
## Typhinweise in **FastAPI** { #type-hints-in-fastapi }
**FastAPI** macht sich diese Typhinweise zunutze, um mehrere Dinge zu tun.
@ -567,7 +569,7 @@ Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das
Das Wichtigste ist, dass **FastAPI** durch die Verwendung von Standard-Python-Typen an einer einzigen Stelle (anstatt weitere Klassen, Dekoratoren usw. hinzuzufügen) einen Großteil der Arbeit für Sie erledigt.
/// info
/// info | Info
Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr über Typen erfahren wollen, dann ist eine gute Ressource <ahref="https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html"class="external-link"target="_blank">der „Cheat Sheet“ von `mypy`</a>.