# 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.
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.
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.
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.
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+**“.
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.
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.
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.
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`:
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_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`.
* 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.
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 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).
* 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`.
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.
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.
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.
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.
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:
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. 😎
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.
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.
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`“.
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.
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
/// 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`.
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.
**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.
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>.
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>.