Python-Kurs / Typ-Hinweise, mypy und Laufzeitprüfungen unterscheiden
Typ-Hinweise beschreiben, welche Eingabe- und Rückgabetypen eine Funktion erwartet. Der gewöhnliche Python-Interpreter erzwingt diese Annotationen nicht automatisch: Verwenden Sie sie für lesbare Schnittstellen und statische Prüfungen, und prüfen Sie tatsächliche externe Werte zusätzlich zur Laufzeit.
Einen Typvertrag lesen, ohne eine Umwandlung anzunehmen
amount: int bedeutet, dass der Parameter als Ganzzahl vorgesehen ist. Es ist kein Aufruf von int(...) und wandelt eine übergebene Zeichenfolge nicht automatisch um. -> str beschreibt einen erwarteten Zeichenfolgen-Rückgabewert. Ein Editor oder ein statisches Analysewerkzeug kann damit ungeeignete Aufrufe und widersprüchliche Rückgabepfade erkennen.
list[int] bezeichnet eine Liste von Ganzzahlen; dict[str, str] beschreibt ein Dictionary mit Zeichenfolgen als Schlüsseln und Werten. str | None erlaubt eine Zeichenfolge oder das Fehlen eines Werts. Dieses optionale Ergebnis verlangt eine bewusste Behandlung beim Aufrufer. Es bedeutet nicht, dass jede Funktion automatisch None zurückgeben darf.
Die Übung verwendet Python 3.12 oder neuer. Für diese einfachen Schreibweisen brauchen Sie keinen Import aus typing. Die Python-Referenz zu Typ-Hinweisen beschreibt auch weitere Typkonstrukte. Falls Sie Annotationen dynamisch auswerten, prüfen Sie die Regeln Ihrer konkreten Python-Version; deren Auswertung und Zugriff sind eine eigene Aufgabe neben der normalen Funktionsausführung.
Hinweise mit ausdrücklich geschriebenen Prüfungen vergleichen
Speichern Sie das vollständige Programm als UTF-8-Datei hints.py in einem eigenen Übungsordner. Starten Sie es mit python hints.py in Ihrer Projektumgebung. Unter macOS oder Ubuntu kann außerhalb einer virtuellen Umgebung der Interpreterbefehl python3 heißen.
def format_amount(amount: int) -> str:
if type(amount) is not int or amount < 0:
raise ValueError("invalid amount")
return f"{amount:,} KRW"
def find_name(names: dict[str, str], key: str) -> str | None:
return names.get(key)
print(format_amount(8000))
print(find_name({"e1": "lunch"}, "missing"))
try:
format_amount("8000")
except ValueError:
print("rejected")
Erwartete Ausgabe:
8,000 KRW
None
rejected
Das Komma in {amount:,} ist eine Formatangabe für eine Tausendertrennung mit Komma; es richtet sich hier nicht nach einem deutschen Zahlenformat. KRW bezeichnet den koreanischen Won. Beides gehört zum festgelegten Beispiel, nicht zum Typ-Hinweis.
find_name findet den angefragten Schlüssel nicht und liefert deshalb None. Beim letzten Aufruf ist "8000" eine Zeichenfolge. Die ausdrücklich geschriebene Bedingung erkennt den falschen Typ und löst ValueError aus. Der Handler gibt daraufhin rejected aus. Diese Ablehnung stammt aus dem Funktionskörper, nicht aus einer automatischen Prüfung der Annotation.
Auch ein negativer Ganzzahlbetrag ist laut Typ-Hinweis zwar ein int, wird vom zusätzlichen Wertebereichstest aber abgelehnt. Ebenso lehnt die genaue Prüfung mit type(amount) is not int boolesche Werte ab. Typ und fachliche Zulässigkeit sind somit zwei unterschiedliche Ebenen.
Einen statischen Prüfer ausführen und den absichtlichen Fehler beheben
Als optionale zusätzliche Prüfung können Sie mypy in der Projektumgebung installieren und die Datei analysieren:
python -m pip install mypy
python -m mypy hints.py
Der Aufruf format_amount("8000") im Original ist absichtlich falsch typisiert. mypy sollte einen ungeeigneten Argumenttyp melden und die Prüfung mit einem Fehlerstatus beenden. Das steht nicht im Widerspruch dazu, dass python hints.py die Ausnahme behandelt und normal beendet wird: Das eine prüft Codebeziehungen ohne Programmausführung, das andere führt den Funktionskörper samt Fehlerbehandlung aus.
Erstellen Sie zum Vergleich eine Kopie hints_fixed.py. Ändern Sie darin nur den absichtlichen falschen Aufruf im try-Block zu format_amount(8000) und prüfen Sie mit python -m mypy hints_fixed.py erneut. Die statische Prüfung soll nun erfolgreich sein. Wenn Sie diese Kopie ausführen, fällt die Ausgabe rejected weg, weil der Aufruf keinen Fehler mehr auslöst; die ursprüngliche Beispieldatei bleibt als Vergleich erhalten.
Die genaue Fehlermeldung kann sich mit der Prüfer-Version ändern. Die Mypy-Einführung zur Installation und statischen Prüfung erläutert das Vorgehen. Falls das Modul nicht gefunden wird, prüfen Sie, ob Installation und Aufruf dieselbe Projektumgebung verwenden.
| Prüfebene | Beispielfrage | Grenze |
|---|---|---|
| Statische Typprüfung | Wird eine Zeichenfolge an einen int-Parameter übergeben? | Prüft keine tatsächlich eingehende Netzwerkantwort |
| Laufzeitprüfung | Ist der konkrete Betrag eine nichtnegative Ganzzahl? | Muss an den vorgesehenen Eingabestellen wirklich ausgeführt werden |
Eine erfolgreiche statische Prüfung garantiert weder vorhandene Dateien noch erreichbare Dienste oder fachlich richtige Beträge. Ersetzen Sie Typen nicht pauschal durch Any, um Meldungen zu verbergen: Damit geben Sie dem Prüfer an dieser Stelle weniger überprüfbare Information.
Fehlende Werte und Eingabegrenzen bewusst behandeln
Wenn find_name ein Ergebnis liefert, speichern Sie es etwa als name und prüfen Sie vor einem Zeichenfolgenaufruf if name is not None:. Erst in diesem Zweig ist ein Zugriff wie name.upper() sinnvoll. Ein leeres, aber vorhandenes Ergebnis "" unterscheidet sich dabei von None; eine bloße Wahrheitsprüfung würde beide Fälle zusammenfassen.
Eine externe JSON-Antwort wird durch eine Annotation allein nicht zuverlässig in das beschriebene Dictionary verwandelt. Auch find_name führt in diesem Beispiel keine eigene Prüfung aller Dictionary-Werte durch. Wenn die Herkunft der Daten nicht den Vertrag garantiert, prüfen Sie die Struktur vor dem Aufruf. Entscheiden Sie außerdem ausdrücklich, ob Sie einen Betrag als Text akzeptieren und umwandeln oder ihn als Eingabefehler ablehnen.
- Vergleichen Sie Original und korrigierte Kopie sowohl mit dem Interpreter als auch mit mypy. Halten Sie statischen Fehlerstatus und tatsächliche Programmausgabe getrennt fest.
- Probieren Sie einen negativen Ganzzahlbetrag. Auch ein typkorrekter Aufruf muss hier den Wertebereichstest bestehen.
- Prüfen Sie bei
find_nameeinen vorhandenen, einen fehlenden und einen vorhandenen leeren Namen. Behandeln Sie das fehlende Ergebnis, bevor Sie Zeichenfolgenmethoden aufrufen.
Kontrollieren Sie bei neuen Funktionen alle Rückgabepfade und prüfen Sie deren tatsächliche Ergebnisse. Den Umgang mit bewusst ausgelösten Ausnahmen erklärt der Kurs zu try, except und raise.




