Python Typisierung: Wenn man lernt, in Python zu codieren, ist die Frage der Typisierung ein Thema, das nur sehr selten berücksichtigt wird, obwohl es bei einer Sprache wie Java unumgänglich ist. Wie kommt es also zu diesem "Vergessen" bei einer der meistgenutzten Programmiersprachen des letzten Jahrzehnts?
Um diese Frage zu beantworten, ist es wichtig, sich mit einigen Grundlagen zu beschäftigen. Die Entwicklung von Software erfordert ein klares Verständnis der Datentypisierung und der Art und Weise, wie Daten in verschiedenen Kontexten verwendet werden. Die Typisierung bzw. die Python Typisierung in der Programmierung definiert die Art der Werte, die die Daten, die wir bearbeiten, annehmen können. Um den Typ einer Variablen in Python zu testen, rufen wir die Funktion type() auf, die, wenig überraschend, den Typ des Objekts, das als Parameter der Funktion eingegeben wurde, zurückgibt.
Die Funktion wird wie folgt verwendet:
Der Typ des Arguments wird mithilfe der Funktion print() in folgender Form angezeigt:
>> <class ‚int‘>
Im obigen Beispiel wird eine ganzzahlige numerische Variable getestet, der entsprechende Typ ist int. In Python gibt es eine Vielzahl von sogenannten nativen Typen. Eine vollständige Liste findest du auf der Seite der offiziellen Dokumentation.
Python ist als dynamisch typisierte Sprache ziemlich flexibel bei der Verwaltung von Datentypen, aber diese Flexibilität kann manchmal zu Verwirrung und Fehlern führen. Hier kommen die Python Typisierung bzw. Typ-Annotationen ins Spiel, die dem Python-Code eine zusätzliche Ebene der Klarheit und Typüberprüfung hinzufügen.
Python Typisierung
In der Programmierung gibt es hauptsächlich zwei Arten der Typisierung: die statische und die dynamische Typisierung.
1. Statische Typisierung
In einer statisch typisierten Sprache muss jede Variable einem vom Programmierer festgelegten Typ zugewiesen werden. Sprachen wie Java, C und C++ verfolgen diesen Ansatz. Nehmen wir das Beispiel von Java für die Definition einer numerischen Variable, so lautet die Syntax wie folgt:
int a = 2;
Float b = 3,;
String c = ‚Hello World‘;
Du musst Java nicht beherrschen, um diese Syntax zu verstehen. Jede Variable a, b oder c wird durch ihren Typ eingeleitet, gefolgt von dem ihr zugewiesenen Wert. Der statische Aspekt der Typisierung wird deutlich, und um ihn zu überprüfen, musst du einfach nur sehen, was passieren würde, wenn du versuchst, einer der Variablen einen neuen Wert zuzuweisen. Du kannst es auf diesem Online-Compiler selbst ausprobieren.
Ein wichtiger Vorteil dieses Ansatzes ist die Strenge, die er bei der Definition von Variablen an den Tag legt: Es gibt keine Zweifel über die Art der Variablen, und es ist für den Compiler leichter, typbezogene Fehler zu erkennen. Außerdem wird die Typüberprüfung in der Regel beim Kompilieren durchgeführt, was eine schnellere Ausführung ermöglicht.
2. Dynamische Typisierung
Im Gegensatz dazu setzt Python auf dynamische Typisierung. Das bedeutet, dass die Typisierung erst nach der Ausführung des Codes durchgeführt und überprüft wird, nicht vorher. Wenn du also eine Variable in Python definierst, musst du ihren Typ nicht angeben, sondern er wird vom Interpreter abgeleitet. Außerdem kann man, sobald eine Variable definiert ist, ihr unabhängig von ihrem Typ einen neuen Wert zuweisen, ohne einen Fehler zu verursachen.
Beispiel:
Welche Typisierung soll ich also am besten wählen?
Auf diese Frage gibt es keine feste Antwort: Sie wird vom Programmierrahmen bestimmt. Wenn die Aufgabe absolute Disziplin und Transparenz im Code erfordert, dann ist eine statische Typisierung die beste Wahl. Wenn der Programmierer die freie Hand über den Code haben soll, dann kann die Flexibilität und die Geschwindigkeit des Schreibens einer dynamischen Typisierung eine interessante Lösung sein.
Aber sollte man Python meiden, wenn man eine statische Typisierung will?
Python Typisierung bzw. Typ-Annotationen in Python
Um eine statische Typisierung zu simulieren, bietet Python ein System von Typ-Annotationen. Mit Typannotationen kann der Programmierer den Typ der Argumente einer Funktion und den Typ ihres Rückgabewerts angeben. Beispiel:
Diese Funktion, die als Argument eine Zeichenkette a verwendet, die standardmäßig den Wert ‚Hello World‘ und gibt diese Zeichenkette aus, können wir zwei Anmerkungen angeben:
- Die erste Annotation entspricht dem Typ der gewünschten Argumentvariablen, a : str. Hier wird angegeben, dass das Argument a, das der Benutzer unserer Funktion eingibt, vom Typ str sein muss
- Die zweite Annotation gibt den Typ des Ausgabewertes unserer Funktion an, -> None. Hier wird angegeben, dass die Funktion nichts zurückgibt, was mit ihrem Ziel übereinstimmt, nur ein Ergebnis anzuzeigen.
Diese Anmerkungen sind über das Attribut __annotations__ zugänglich, in unserem Beispiel haben wir die folgenden Anmerkungen:
Es ist wichtig zu beachten, dass diese Annotationen Hinweise und keine strikten Einschränkungen sind. Python verhindert nicht die Ausführung des Codes, wenn die tatsächlichen Typen nicht mit den annotierten Typen übereinstimmen. Allerdings können diese Annotationen sehr hilfreich sein, um die Absicht des Programmierers zu verstehen und potenzielle Typisierungsfehler zu erkennen.
MyPy: Ein Typprüfer für die Python Typisierung
Auch wenn Typ-Annotationen nützlich sind, bieten sie keine echte Typüberprüfung in Python. Um diese Lücke zu schließen, können Werkzeuge von Drittanbietern wie MyPy verwendet werden.
MyPy ist eine Python-Bibliothek, die die statische Typisierung von Python-Code überprüft und dabei hilft, Fehler zu finden, bevor dein Programm ausgeführt wird. Sie arbeitet Hand in Hand mit den Typ-Annotationen und stellt sicher, dass diese eingehalten werden. MyPy macht den Code nicht ungültig, wenn die Typisierung nicht beachtet wird, aber es liefert einen detaillierten Bericht über die aufgetretenen Typisierungsfehler. Dadurch kann der Entwickler diese Fehler beheben, bevor sie zu Problemen bei der Ausführung des Codes führen.
Die gebräuchlichste Art, es zu verwenden, ist die Verwendung als Debugger nach folgendem Schema:
- Schreibe deinen Python-Code und speichere ihn als .py.
- Gebe in einem Terminal folgenden Befehl ein: mypy my_file.py
Wenn Fehler gefunden werden, werden sie von MyPy zurückgegeben, wobei der Typ des Fehlers, seine Position im Code und die Ursache des Fehlers angegeben werden.
Zusammenfassend lässt sich sagen, dass, obwohl Python eine Sprache mit dynamischer Typisierung ist, die Verwendung von Typ-Annotationen und Typ-Prüfern wie MyPy die Klarheit und Robustheit des Python-Codes stark verbessern kann. Diese Werkzeuge können besonders in großen Softwareentwicklungsprojekten nützlich sein, wo ein klares Verständnis der Datentypisierung für die Aufrechterhaltung eines qualitativ hochwertigen Codes unerlässlich ist.