Type Hints in Python

Python verwendet eine dynamische Typisierung, dies kann zu Problemen/Fehlern führen, die erst während der Laufzeit erkannt werden. Mit Type Hints soll dieses Problem behoben werden.

Type Hints wurde in PEP 484 vorgeschlagen und in Python 3.5 umgesetzt, welches im September 2015 erschienen ist. Mit Type Hints wird kein statische Typisierung eingeführt, sondern lediglich die Möglichkeit geschaffen, dass festgelegt werden kann, von welchem Typ eine Variable ist. Wird eine Variable mit einem Hinweis auf deren Typ(Type Hint) versehen, können Tools wie zum Beispiel mypy den Qullcode eines Python Programms oder einer Bibliothek analysieren und mögliche Fehler vor der Ausführung aufzeigen.

Installation

Type Hints werden ab Python 3.5 offiziell unterstützt und es ist keine weitere Installation notwendig. Das für die Analyse notwendige Tool mypy muss jedoch vor der Analyse installiert werden und kommt auch in den Beispielen zum Einsatz.

$ python3 -m pip install mypy

Verwendung

Beispiel 1: Dieses Beispiel verwendet noch keine Type Hints. Durch das Tool mypy werden keine Fehler oder Hinweis angezeigt, jedoch kommt es später bei der Ausführung zu einem Fehler

def add(a, b):
    return a + b


print(add(1, 2))
print(add(1, "a"))
$ mypy test1.py
$ python test1.py
3
Traceback (most recent call last):
  File "test1.py", line 6, in <module>
    print(add(1, "a"))
  File "test1.py", line 2, in add
    return a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Beispiel 2: Dieses Beispiel verwendet Type Hints. Bei der Analyse mit mypy wird ein erster Fehler angezeigt, der sich bei der Ausführung bestätigt.

def add(a: int, b: int) -> int:
    return a + b


print(add(1, 2))
print(add(1, "a"))
$ mypy test2.py  
test2.py:6: error: Argument 2 to "add" has incompatible type "str"; expected "int"
Found 1 error in 1 file (checked 1 source file)
$ python test2.py
3
Traceback (most recent call last):
  File "test2.py", line 6, in <module>
    print(add(1, "a"))
  File "test2.py", line 2, in add
    return a + b
TypeError: unsupported operand type(s) for +: 'int' and 'str'

Fazit

Durch die Entwickler wird bereits in PEP 484 festgehalten, dass durch Type Hints keine statische Typisierung eingeführt werden soll. Auch sollen Type Hints nicht erzwungen werden.

Python will remain a dynamically typed language, and the authors have no desire to ever make type hints mandatory, even by convention.

Jedoch können die Qualität des Quellcodes durch Type Hints und Tools wie mypy verbessert und Fehler eher erkannt werden. Mittlerweile ist auch bei den größeren Linux-Distributionen mindestens Python 3.5 über das jeweilige Paketrepository verfügbar. Python 2.7 hat am 1.1.2020 offiziell sein End of Live erreicht und erhält offiziell keine Updates mehr. Mit diesen Vorraussetzungen werden hoffentlich in Zukunft mehr Entwickler Type Hints zum Einsatz bringen.

Da das Feature optional ist, ist es für die Einführung nicht notwendig gleich alle Dateien anzupassen und umzuschreiben. Bei der Weiterentwicklung bietet es sich an, dass Funktionen, die so wie so angefasst werden müssen gleich entsprechend angepasst und die Tests in die CI Pipeline eingebaut werden.

Links

  • Webseite: PEP 484 (englisch)
  • Webseite: mypy (englisch)

Verwandte Artikel