Kurs
Die Typprüfung in Python erfolgt mit Hilfe des eigenen Interpreters. Da Python eine dynamische Sprache ist, zwingt sie dich nicht, den Typ von Objekten festzulegen. Das kann zu Bugs führen und Fehler schwer auffindbar machen. Um dem entgegenzuwirken, lässt sich Python mit verschiedenen Tools kombinieren und um Funktionen des statischen Type Checkings ergänzen — zusätzlich zu seinem eigenen Duck Typing.
Es gibt zwei grundsätzliche Typensysteme, die von unterschiedlichen Programmiersprachen verwendet werden:
- Statisch typisierte Sprachen
- Dynamisch typisierte Sprachen
Statisch typisierte Sprachen
Die Typprüfung von Variablen erfolgt zur Compile-Zeit. Außerdem erzwingt das Typsystem, dass der Datentyp einer Variable vor der Verwendung explizit deklariert wird. Beispiele für statisch typisierte Sprachen sind: Scala, Java, C++ usw.
Ein String in Scala wird zum Beispiel so deklariert:var myCar:String = "Mercedes";
Der Code zeigt, dass die Variable "myCar" explizit als Datentyp "String" mit dem Wert "Mercedes" deklariert ist.
Dynamisch typisierte Sprachen
Die Typprüfung von Variablen erfolgt zur Laufzeit. Das Typsystem zwingt nicht dazu, den Datentyp vor der Verwendung explizit anzugeben. Dynamisch typisierte Sprachen sind z. B.: Python, JavaScript, Ruby usw.
Ein String in Python wird zum Beispiel so definiert:myCar = "Mercedes"
Hier muss die Variable "myCar" nicht explizit deklariert werden.
"type()" und "isinstance()" in Python
Mit Pythons eingebauter Funktion "type()" kannst du den Variablentyp herausfinden. "type()" lässt sich zur Laufzeit nutzen, um beim Debuggen die konkreten Typen im Programm zu ermitteln. Schau dir das folgende Beispiel an.
my_var = 12
print(type(my_var))
Der obige Code gibt "int" aus, weil der Datentyp der Variablen ein Integer ist und "type()" ihn entsprechend identifiziert.
Mit "isinstance(obj, class)" in Python kannst du prüfen, ob "obj" (also ein Objekt) eine Instanz der angegebenen Klasse ist. Der Rückgabewert ist ein boolescher Wert, also True oder False.
my_var = "Hello"
print(isinstance(my_var,str))
Der obige Code gibt True aus, da der Datentyp der Variable ein String ist und "isinstance()" das korrekt erkennt.
Duck Typing in Python
Ein bekanntes Prinzip in Python lautet: "If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck." Kurz gesagt: Der konkrete Typ eines Objekts oder einer Klasse ist zweitrangig. Entscheidend ist, dass das Objekt die erforderlichen Methoden und Eigenschaften mitbringt — dann kann es für einen bestimmten Zweck verwendet werden.
Schauen wir uns dazu ein Beispiel an.
Im folgenden Beispiel gibt es zwei Klassen: "Duck" und "Human". Die Klasse Duck besitzt die Methoden "quack" und "fly". Entsprechend hat auch die Klasse Human eigene Methoden namens "quack" und "fly". Duck und Human sind verschiedene Klassen und damit unterschiedliche Typen. Da Human jedoch die gleichen Methoden "fly" und "quack" bereitstellt, kann ein Human-Objekt in einem Kontext verwendet werden, der diese Methoden erwartet. Es gibt außerdem die Funktion "fly_quack", die eher zum "Duck" zu passen scheint, weil sie fliegen und schnattern aufruft.
class Duck:
def quack(self):
print('Quack')
def fly(self):
print('Flap')
class Human:
def quack(self):
print('Trying to Quack like a duck')
def fly(self):
print('Spreading my arm to flap like a duck')
def fly_quack(thing):
thing.quack()
thing.fly()
Erzeuge nun eine Instanz von "Duck" als du und übergib sie an die Funktion "fly_quack(du)". Genauso erzeugst du für Human die Instanz "h" und rufst "fly_quack(h)" auf.
du = Duck()
fly_quack(du)
h = Human()
fly_quack(h)
Die Ausgabe des obigen Codes sieht so aus:
Trying to Quack like a duck
Spreading my arm to flap like a duck
Quack
Flap
Obwohl "Human" eine andere Klasse als "Duck" ist, ruft Python die Funktion "fly_quack" auch für Human auf. Die Objekttypen sind verschieden, aber da "Human" die Methoden "quack" und "fly" bereitstellt, verhält es sich im relevanten Kontext wie eine Ente und liefert die benötigten Methoden.
Type Hints und mypy
Dynamisch typisierte Sprachen wie Python punkten bei Lesbarkeit und Zugänglichkeit, haben aber auch Nachteile. Einer davon: Laufzeitfehler können sich einschleichen, weil Python den Variablentyp nicht erzwingt. Je größer der Code wird, desto schwieriger wird es, solche Fehler und Bugs zu finden.
Seit Version 3.5 unterstützt Python Type Hints. Ältere Versionen bieten diese Funktion nicht.
Schauen wir uns zunächst ein einfaches Beispiel ohne Type Hints und ohne mypy an.
Die folgende Funktion soll zwei ganze Zahlen subtrahieren und das Ergebnis zurückgeben.
def sub_this(x,y):
return 'Subtraction'
print(sub_this(8,'hello'))
Eigentlich sollte die Funktion zwei Integer "x" und "y" akzeptieren. Da aber keine Regeln durchgesetzt werden, kann sie Werte beliebigen Typs annehmen. Auch der Rückgabewert ist hier ein String ("Subtraction"), erwartet wäre jedoch ein Integer.
Im nächsten Schritt setzen wir Type Hints und "mypy" ein. So lässt sich statisches Type Checking ergänzen und Fehler im Programm deutlich einfacher reduzieren.
"mypy" ist ein Python-Modul für statisches Type Checking. Es kombiniert Pythons dynamische Prüfung bzw. Duck Typing mit Type Hints.
Installiere das Paket mit:pip install mypy
Lege lokal eine Datei namens "mypy_example.py" an und füge den folgenden Code ein.
Das Programm nimmt zwei Integer als Parameter entgegen. Nach "->" ist der Rückgabetyp angegeben, ebenfalls ein Integer. Die Funktion sollte also einen Integer zurückgeben, gibt aber einen String "Subtracted two integers" zurück.
def sub_this(x:int,y:int) -> int:
return 'Subtracted two integers'
print(sub_this(8,4))
Führe den Code im Terminal mit folgendem Befehl aus.
mypy mypy_example.py
Daraufhin erscheint ein Fehler, der darauf hinweist, dass ein unerwarteter Rückgabewert vom Typ "str" gefunden wurde und stattdessen ein "int" zurückgegeben werden muss.

Passen wir nun die Rückgabe an, sodass die Differenz der beiden Integer als Integer zurückgegeben wird.
def sub_this(x:int,y:int) -> int:
return x - y
print(sub_this(8,4))

Wie zu sehen ist, erscheint nun eine Erfolgsmeldung und es wurden keine Probleme gefunden.
Glückwunsch
Glückwunsch, du hast es bis zum Ende dieses Tutorials geschafft!
In diesem Tutorial hast du Type Checking kennengelernt, die unterschiedlichen Typensysteme, Pythons Methoden ("type()" und "isinstance()"), Duck Typing sowie Type Hinting in Kombination mit "mypy".
Wenn du mehr über Python lernen möchtest, starte DataCamps Kurs Software Engineering for Data Scientists in Python.
Referenzen: