0%

Ausdrucksstärkere Funktionen · Übung

Beschreibe Werte mit Typhinweisen

Die vorige Lektion hat mit einem Docstring die Zusage einer Funktion in vollständigen Sätzen beschrieben. Manchmal brauchen Leser außerdem eine kurze Übersicht über die Arten von Werten, die in eine Funktion hineingehen und aus ihr herauskommen.

Python erlaubt dir, solche Hinweise direkt zur Funktionsdefinition hinzuzufügen. Sie heißen Typhinweise oder Type Hints.

Gib den Typ eines Parameters an

Beginne mit einer gewöhnlichen Funktion:

def repeat(text, times):
    return text * times

Um anzugeben, dass text ein String sein sollte, schreibe nach dem Parameter einen Doppelpunkt und den Typnamen:

def repeat(text: str, times):
    return text * times

Das : str ist ein Typhinweis. Es sagt, dass die Funktion für text einen String erwartet.

Du kannst jedem Parameter einen eigenen Hinweis geben:

def repeat(text: str, times: int):
    return text * times

Lies diese Definition so: „repeat erwartet einen String namens text und eine ganze Zahl namens times.“

Der Hinweis verwendet einen Typnamen wie str, int, float oder bool. Er verwendet keinen Beispielwert. Schreibe deshalb text: str und nicht text: "hello".

Gib den Rückgabetyp an

Ein Hinweis nach einem Pfeil beschreibt den Wert, den die Funktion zurückgibt:

def repeat(text: str, times: int) -> str:
    return text * times

Das -> str sagt, dass repeat einen String zurückzugeben verspricht. Der Pfeil gehört hinter die schließende Klammer und vor den Doppelpunkt, der die def-Zeile beendet.

Hier ist eine Durchschnittsfunktion mit allen drei Hinweisen:

def average(total: int, count: int) -> float:
    return total / count

Du kannst sie von links nach rechts lesen:

  • total: int sagt, dass total eine ganze Zahl sein sollte;

  • count: int sagt, dass count eine ganze Zahl sein sollte;

  • -> float sagt, dass die Funktion eine Fließkommazahl zurückgeben sollte.

Der Funktionsaufruf ändert sich nicht:

result = average(21, 3)

Die Hinweise gehören zur Definition, nicht zu jedem Aufruf.

Sieh dir Typhinweise mit help() an

In der vorigen Lektion hast du mit help() den Docstring einer Funktion gelesen. Dieselbe Ausgabe zeigt auch ihre Typhinweise.

Führe dieses Beispiel aus:

Try it

help() fasst die Funktion so zusammen:

average(total: int, count: int) -> float

Die Hinweise zu Parametern und Rückgabe stammen aus der Funktionsdefinition. Der Satz darunter stammt aus dem Docstring. Zusammen zeigen sie beide Arten von Dokumentation, ohne dass jemand den Funktionskörper lesen muss.

Hinweise beschreiben, sie erzwingen nichts

Python lehnt einen Wert nicht automatisch ab, nur weil er einem Typhinweis widerspricht:

Try it

Der zweite Aufruf übergibt einen String, obwohl der Hinweis int lautet. Python führt den Funktionskörper trotzdem aus, und die Multiplikation des Strings erzeugt "haha".

Der Funktionskörper bestimmt weiterhin, was während der Programmausführung geschieht.

Das unterscheidet sich von vielen anderen Programmiersprachen. In statisch typisierten Sprachen wie Java, C# und Rust gehören deklarierte Typen zu den Regeln der Sprache. Die Übergabe des falschen Typs wird normalerweise vor der Programmausführung abgelehnt. Pythons Typhinweise liefern hilfreiche Informationen, werden von Python aber nicht automatisch erzwungen.

Unterstütze automatische Prüfwerkzeuge

Typhinweise sind besonders nützlich für Werkzeuge, die Code auf wahrscheinliche Fehler untersuchen. Ein Linter ist ein allgemeines Werkzeug zur automatischen Codeprüfung. Ein Typprüfer konzentriert sich darauf, ob Werte zu den Typhinweisen passen.

Zum Beispiel kann ein Typprüfer diesen Aufruf mit der Definition oben vergleichen:

double("ha")

Er kann warnen, dass double einen int erwartet, der Aufruf aber einen str übergibt. Der Prüfer kann diese Abweichung finden, ohne das Programm auszuführen. Codeeditoren zeigen solche Hinweise möglicherweise schon beim Tippen an.

Der Hinweis ändert Pythons Verhalten zur Laufzeit nicht: Wie das ausführbare Beispiel gezeigt hat, führt Python selbst den Aufruf weiterhin aus. Typhinweise geben Menschen und automatischen Prüfwerkzeugen mehr Informationen, um einen wahrscheinlichen Fehler früher zu erkennen.

Deshalb sind zutreffende Hinweise wichtig. Ein falscher Hinweis kann die nächste Person irreführen, die die Funktion verwendet.

Welche Definition sagt, dass name ein String sein sollte und die Funktion einen String zurückgibt?

Ergänze eine vorhandene Funktion um Hinweise

Die Prozentfunktion berechnet bereits das richtige Ergebnis. Füge nur die Typhinweise hinzu, die ihre beiden Parameter und ihren Rückgabewert beschreiben. Die nächste Lektion verwendet diesen Rückgabewert, um reine Funktionen mit Seiteneffekten zu vergleichen.

Aufgabe

Füge der vorhandenen Funktion percentage Typhinweise hinzu.

  • Gib an, dass score ein int ist.

  • Gib an, dass total ein int ist.

  • Gib an, dass die Funktion einen float zurückgibt.

  • Ändere weder die Berechnung noch den Aufruf unter der Funktion.

Nur die def-Zeile muss geändert werden.