Weiter zum Inhalt
Python

Type Checking in Python Tutorial

Lerne Type Checking kennen: Typensysteme in verschiedenen Sprachen, Duck Typing und Type Hinting.
Olivia Smith
Aktualisiert · 7 Min. lesen

Entdecke KI

ChatGPTClaudePerplexity

Erstelle dein kostenloses Konto

Üben und Lernpfad deinen Fortschritt.

Weiter Mit Google
Durch Klick auf die Schaltfläche akzeptierst du unsere Nutzungsbedingungen, unsere Datenschutzrichtlinie und die Speicherung deiner Daten in den USA.

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:

    1. Statisch typisierte Sprachen
    2. 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.

Error message

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))

Success message

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:

  1. Coreys YouTube-Video zu Duck Typing
Themen
Python

Mehr über Python lernen

Kurs

Einführung in Python

4 Std.
7.1M
Lerne in nur vier Stunden die Grundlagen der Datenanalyse mit Python und entdecke beliebte Python-Pakete.
Details anzeigenKurs Starten

Erstelle dein kostenloses Konto

Üben und Lernpfad deinen Fortschritt.

Weiter Mit Google
Durch Klick auf die Schaltfläche akzeptierst du unsere Nutzungsbedingungen, unsere Datenschutzrichtlinie und die Speicherung deiner Daten in den USA.
Mehr anzeigen
Ähnlich

Tutorial

Python Datenstrukturen Tutorial

Mach dich mit Python-Datenstrukturen vertraut: Lerne mehr über Datentypen und primitive sowie nicht-primitive Datenstrukturen wie Strings, Listen, Stapel usw.
Sejal Jaiswal's photo

Sejal Jaiswal

24 Min.

Tutorial

if…elif…else in Python Tutorial

Lerne, wie du in Python if…elif…else-Anweisungen erstellst.
DataCamp Team's photo

DataCamp Team

4 Min.

Tutorial

Python-Tutorial zum Verknüpfen von Zeichenfolgen

Lerne verschiedene Methoden zum Verknüpfen von Zeichenfolgen in Python kennen, mit Beispielen, die jede Technik zeigen.
DataCamp Team's photo

DataCamp Team

5 Min.

Tutorial

Python range()-Funktion Tutorial

Lerne anhand von Beispielen die Python-Funktion range() und ihre Möglichkeiten kennen.
Aditya Sharma's photo

Aditya Sharma

7 Min.

Tutorial

Python-Anweisungen IF, ELIF und ELSE

In diesem Tutorial lernst du ausschließlich Python if else-Anweisungen kennen.
Sejal Jaiswal's photo

Sejal Jaiswal

9 Min.

Tutorial

Python-Listenfunktionen und -Methoden – Tutorial und Beispiele

Lerne die Funktionen und Methoden von Python-Listen kennen. Schau dir jetzt die Code-Beispiele für list() und andere Python-Funktionen und -Methoden an!
Abid Ali Awan's photo

Abid Ali Awan

7 Min.

Mehr anzeigen