Python / type() / Den Datentyp eines Werts prüfen
Pythons type(value) liefert das tatsächliche Typobjekt eines Werts, keinen String wie "int". Für einen exakten Vergleich verwenden Sie type(value) is int. Sollen auch Unterklassen erlaubt sein, eignet sich für gewöhnliche Prüfungen isinstance().
Grundlagen und das zurückgegebene Objekt
Mit einem Argument liefert type() den Objekttyp. Typen sind selbst Objekte wie Zahlen, Strings und Sammlungen. Die interaktive Shell zeigt Ausdrucksergebnisse; ein Skript benötigt dafür print() oder eine andere Ausgabe.
Die Beispiele laufen mit Python 3.12. Speichern Sie jedes vollständige Beispiel als type_example.py in UTF-8 und führen Sie python type_example.py beziehungsweise python3 aus. Ersetzen Sie den Inhalt für unabhängige Versuche.
values = (123, 12.3, "abc", [1, 2], (1, 2), {"a": 1}, {1, 2}, 1 + 2j, True, None)
for value in values:
print(type(value))
Erwartete Ausgabe:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'set'>
<class 'complex'>
<class 'bool'>
<class 'NoneType'>
<class 'int'> ist die Darstellung des Ganzzahl-Typobjekts. Ein Vergleich mit einem String prüft den Typ nicht. __name__ eignet sich als lesbare Bezeichnung, aber nicht als eindeutige Entscheidung: Verschiedene Klassen können denselben Namen haben.
kind = type(123)
print(kind is int)
print(kind == "int")
print(kind.__name__)
True
False
int
Die Form type(name, bases, dict) mit drei Argumenten erzeugt eine neue Klasse. Unterscheiden Sie diesen Zweck von der Typabfrage mit einem Argument.
Exakter Vergleich oder isinstance()
type(value) is T verlangt genau den Typ T. isinstance(value, T) akzeptiert auch Unterklassen und eignet sich daher für Vererbung. Dieses vollständige Beispiel definiert Dog als Unterklasse von Animal und vergleicht Zahlentypen.
class Animal:
pass
class Dog(Animal):
pass
pet = Dog()
print(type(pet).__name__)
print(type(pet) is Animal)
print(isinstance(pet, Animal))
print(type(True) is int)
print(isinstance(True, int))
print(isinstance(3, (int, float)))
Dog
False
True
False
True
True
Ein Dog hat den tatsächlichen Typ Dog, ist aber eine Animal-Instanz. Ebenso ist bool eine Unterklasse von int, sodass isinstance(True, int) wahr ist. Sollen Anzahlen boolesche Werte ablehnen, prüfen Sie exakt auf int oder schließen bool gesondert aus. Ein Tupel von Typen erlaubt mehrere Alternativen.
Eine Variable an einen anderen Typ binden
Bei Python-Objekten und Typen unterscheiden Sie den Namen von seinem aktuellen Bezugsobjekt. Eine Stringzuweisung verwandelt das vorherige Ganzzahlobjekt nicht in einen String.
value = 123
original = value
print(type(value).__name__)
value = "123"
print(type(value).__name__)
print(type(original).__name__)
int
str
int
Anfangs verweisen beide Namen auf dieselbe Ganzzahl. Nach value = "123" verweist value auf einen String und original weiterhin auf die Ganzzahl. Neubindung unterscheidet sich von einer Wertumwandlung durch int() oder str().
Containertypen, Inhalte und Typhinweise
type(values) kontrolliert nicht jeden Listeneintrag. Ein Typhinweis wie list[int] erzwingt zur Laufzeit keine automatische Prüfung oder Umwandlung der Elemente.
values: list[int] = [1, "2"]
print(type(values).__name__)
print(all(type(item) is int for item in values))
try:
print(isinstance(values, list[int]))
except TypeError:
print("TypeError")
list
False
TypeError
Trotz int-Annotation kann zur Laufzeit eine Liste mit dem String "2" entstehen. Die Einzelprüfung auf exakte Ganzzahlen ist falsch. list[int] als zweites Argument von isinstance() löst TypeError aus. Trennen Sie den äußeren Typ vom inneren Schema und nutzen Sie zusätzlich Warnungen eines statischen Typprüfers.
None und Wertbedingungen prüfen
None ist ein eigenständiges Objekt für einen fehlenden Wert; value is None ist eine klare Prüfung. Ein korrekter Typ garantiert noch keinen gültigen Anwendungswert. Die Funktion erlaubt nichtnegative exakte Ganzzahlen und schließt bool aus.
value = None
print(value is None)
print(type(value).__name__)
def valid_count(value):
return type(value) is int and value >= 0
for value in (3, -1, True, "3", None):
print(repr(value), valid_count(value))
True
NoneType
3 True
-1 False
True False
'3' False
None False
and überspringt den Vergleich bei falscher Typprüfung und vermeidet >= 0 für Strings oder None. Dagegen ist -1 eine Ganzzahl, scheitert aber an der Wertbedingung. Entscheiden Sie zuerst zwischen Umwandlung und bestimmten zulässigen Typen und ergänzen Sie Wertebereich, fehlende Werte und Formatbedingungen.




