Zum Inhalt springen
Python – 08 Type Hints

Python – 08 Type Hints

Voraussetzungen

Bevor du mit diesem Modul startest, solltest du bereits vertraut sein mit:

Optionales Bonusmaterial

Type Hints sind für die Grundlagen nicht zwingend erforderlich. Dein Code läuft ohne sie genauso. Sie sind aber Standard in professionellem Python – und sie sind die Brücke zur objektorientierten Programmierung, die du später mit UML-Klassendiagrammen planst.

Wofür braucht man das?

Python ist eine dynamisch typisierte Sprache: Eine Variable kann alles Mögliche enthalten, und du siehst es dem Code nicht an.

1
2
def berechne(a, b):
    return a * b

Was ist a? Eine Zahl? Ein Text? Beides funktioniert – 3 * 4 ergibt 12, aber "ab" * 3 ergibt "ababab". Wer diese Funktion benutzt, muss raten oder den Code lesen.

Mit Type Hints schreibst du die Antwort direkt hin:

1
2
def berechne(a: float, b: float) -> float:
    return a * b

Gelesen: nimmt zwei Kommazahlen, gibt eine Kommazahl zurück.

Der Nutzen:

VorteilWas passiert konkret
DokumentationDie Funktionssignatur erklärt sich selbst – kein Kommentar nötig.
Editor-HilfeVS Code / PyCharm kennen den Typ und schlagen passende Methoden vor (.upper() bei str, .append() bei list).
Fehler vor dem StartDer Editor unterstreicht berechne("Hallo", 3), bevor du das Programm laufen lässt.
TeamarbeitAndere (und du in drei Monaten) verstehen deine Funktion, ohne sie zu lesen.
PlanungTypen sind genau das, was im UML-Klassendiagramm steht (siehe unten).

Python prüft die Typen nicht

Type Hints sind Hinweise, keine Kontrolle. Das hier läuft ohne Fehlermeldung durch:

1
2
3
4
def gruss(name: str) -> str:
    return "Hallo " + name

print(gruss(42))  # Python startet – und stürzt erst bei "+" ab

Geprüft wird von deinem Editor oder einem Extra-Programm wie mypy, nicht von Python selbst.

Die Syntax

Variablen

Doppelpunkt hinter den Namen, dann der Typ.

1
2
3
4
name: str = "Alice"
alter: int = 30
groesse: float = 1.75
ist_schueler: bool = True

Bei so einfachen Fällen lässt man die Angabe meist weg – Python sieht ja selbst, dass "Alice" ein String ist. Richtig nützlich werden Type Hints bei Funktionen.

Funktionen

Typ hinter jedem Parameter, Rückgabetyp hinter dem Pfeil ->.

1
2
3
4
5
def gruss(name: str) -> str:
    return f"Hallo, {name}!"

def flaeche(laenge: float, breite: float) -> float:
    return laenge * breite

Funktionen ohne return bekommen -> None (“gibt nichts zurück”):

1
2
def zeige_info(name: str, alter: int) -> None:
    print(f"{name} ist {alter} Jahre alt.")

Listen und Dictionaries

In den eckigen Klammern steht, was drin ist.

1
2
3
4
5
6
zahlen: list[int] = [1, 2, 3, 4, 5]
namen: list[str] = ["Ali", "Beyza", "Tom"]
noten: dict[str, int] = {"Mathe": 12, "Deutsch": 9}

def durchschnitt(werte: list[float]) -> float:
    return sum(werte) / len(werte)

Kein Import nötig

In älteren Anleitungen findest du from typing import List, Dict. Seit Python 3.9 schreibt man einfach list[int] und dict[str, int] – klein geschrieben, ohne Import.

Mehrere Typen erlauben

Der senkrechte Strich | bedeutet “oder” (ab Python 3.10):

1
2
def zu_text(wert: int | str) -> str:
    return str(wert)

Häufigster Fall: Etwas ist da – oder eben None.

1
2
3
4
def finde_namen(id: int) -> str | None:
    if id == 1:
        return "Alice"
    return None  # nichts gefunden

Bezug zu UML-Klassendiagrammen

Bevor man objektorientiert programmiert, plant man mit einem UML-Klassendiagramm. Dort notiert man für jedes Attribut und jede Methode den Datentyp – genau die Information, die Type Hints im Code festhalten. Ohne Type Hints geht diese Information beim Übersetzen ins Programm verloren.

    classDiagram
    class Rechteck {
        -laenge: float
        -breite: float
        +flaeche() float
        +skaliere(faktor: float)
    }
  

Die Übersetzung ist fast Zeichen für Zeichen dieselbe:

UMLPython mit Type Hints
- laenge: floatself.laenge: float = laenge
+ flaeche(): floatdef flaeche(self) -> float:
+ skaliere(faktor: float)def skaliere(self, faktor: float) -> None:
kein Rückgabetyp im Diagramm-> None
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class Rechteck:
    def __init__(self, laenge: float, breite: float) -> None:
        self.laenge: float = laenge
        self.breite: float = breite

    def flaeche(self) -> float:
        return self.laenge * self.breite

    def skaliere(self, faktor: float) -> None:
        self.laenge = self.laenge * faktor
        self.breite = self.breite * faktor

Das funktioniert auch rückwärts: Aus getyptem Code kannst du das Diagramm direkt ablesen, aus untypisiertem Code musst du raten. Mehr dazu in OOP – UML-Klassendiagramm.

Aufgaben

Aufgabe 1: Typen ergänzen

Ergänze Type Hints für Parameter und Rückgabewerte:

1
2
3
4
5
6
7
8
def addiere(a, b):
    return a + b

def begruesse(name):
    print("Hallo " + name)

def groesste_zahl(zahlen):
    return max(zahlen)

Bei welcher Funktion war es am schwersten? Warum?

Aufgabe 2: Signatur lesen

Was macht diese Funktion vermutlich – nur anhand der ersten Zeile?

1
def zaehle_woerter(text: str) -> dict[str, int]:

Schreibe eine passende Implementierung dazu.

Aufgabe 3: Vom Diagramm zum Code

Übersetze dieses Klassendiagramm in Python – mit Type Hints:

    classDiagram
    class Schueler {
        -name: str
        -noten: list~int~
        +note_hinzufuegen(note: int)
        +durchschnitt() float
        +ist_versetzt() bool
    }
  

Aufgabe 4: Grenzen erkennen

Probiere aus:

1
2
3
4
def verdopple(zahl: int) -> int:
    return zahl * 2

print(verdopple("Hi"))

Was gibt Python aus? Warum meldet der Type Hint keinen Fehler – und was zeigt dir dein Editor trotzdem an?

Fazit

  • Type Hints sagen, welche Daten rein- und rausgehen.
  • Sie machen Code lesbar, ermöglichen Editor-Warnungen und ersparen Kommentare.
  • Python prüft sie nicht zur Laufzeit – Editor oder mypy tun das.
  • Sie sind die Code-Entsprechung der Typangaben im UML-Klassendiagramm.
Zuletzt aktualisiert am