HOWTO · Python

Lösen Sie den TypeError: In Python ist eine ganze Zahl erforderlich

In diesem Tutorial wird TypeError behandelt: In Python ist eine ganze Zahl erforderlich.

Auf dieser Seite

Die Meldung TypeError: an integer is required erscheint, wenn Python-Code einer Funktion einen Wert des falschen Typs übergibt: Die Funktion erwartete eine ganze Zahl und erhielt etwas anderes, meist eine Zeichenkette. Sie tritt in Schleifen auf, die String-Zeichen an chr() übergeben, bei Einstellungen, die als Text statt als Zahl übergeben werden, und bei unzähligen ähnlichen Aufrufen.

Diese Anleitung erklärt, was die Meldung tatsächlich bedeutet, wie Sie den Wert finden, der sie verursacht hat, und wie Sie die Korrektur wählen, die zu dem passt, was der Code bewirken soll.

Was „TypeError: an integer is required“ bedeutet

Ein TypeError mit diesem Wortlaut meldet ein einzelnes fehlerhaftes Argument: Eine Funktion oder Methode hat festgelegt, dass einer ihrer Parameter eine ganze Zahl sein muss — ein Unicode-Codepoint, eine Anzahl, eine maximale Länge, ein Dateimodus — und der übergebene Wert war keine. Die Prüfung erfolgt beim Parsen des Aufrufs, sodass die Funktion fehlschlägt, bevor sie irgendeine Arbeit verrichtet.

Python formuliert denselben Fehlschlag je nach auslösender Funktion und verwendeter Version auf verschiedene Weise. Sie können an integer is required, an integer is required (got type str) oder 'str' object cannot be interpreted as an integer sehen. Alle drei sind TypeError, und alle drei bedeuten dasselbe: Der Typ des Arguments entsprach nicht der Anforderung des Parameters.

Verwechseln Sie dies nicht mit den Meldungen der Familie unsupported operand type(s). Ein Ausdruck wie "10" + 5 löst TypeError: can only concatenate str (not "int") to str aus, was zwei Operanden beschreibt, die nicht kombiniert werden können — eine andere Diagnose mit einer anderen Lösung, obwohl es ebenfalls ein TypeError ist.

Warum dieser Fehler auftritt

Eingebaute Funktionen und die in C implementierten Teile der Standardbibliothek parsen ihre Argumente streng. Wenn der Parser eine Zeichenkette findet, wo eine ganze Zahl erforderlich ist, wird der Aufruf sofort abgebrochen. Ein minimaler Auslöser ist der Parameter maxlen von collections.deque, der eine ganze Zahl sein muss:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from collections import deque

try:
    queue = deque([], "3")
except TypeError as error:
    print(f"{type(error).__name__}: {error}")
TypeError: an integer is required

Ein häufigerer Weg, denselben Fehler auszulösen, ist der Aufruf von chr() innerhalb einer Schleife über einen String. Das Iterieren über einen String liefert einzelne Zeichen-Strings, aber chr() bildet einen ganzzahligen Codepoint auf ein Unicode-Zeichen ab, sodass jedes Zeichen, das die Schleife erzeugt, abgelehnt wird:

try:
    for char in "42":
        print(chr(char))
except TypeError as error:
    print(f"{type(error).__name__}: {error}")
TypeError: 'str' object cannot be interpreted as an integer

Dieselbe Fehlerklasse, anderer Wortlaut. In beiden Fällen beginnt die Lösung auf dieselbe Weise: Finden Sie das Argument, das keine ganze Zahl ist.

So diagnostizieren Sie den an die Funktion übergebenen Wert

Lesen Sie den Traceback von unten nach oben. Die letzte Zeile nennt den Ausnahmetyp und die Meldung; die Zeile direkt darüber zeigt den fehlgeschlagenen Aufruf. Verfolgen Sie das Argument von dort zurück zu seinem Ursprung — eine Schleifenvariable, input(), eine Konfigurationsdatei oder ein JSON-String-Feld — denn als Text gelesene Werte kommen als Strings an, während geparste Formate wie JSON bereits typisierte Werte liefern können.

Wenn die Meldung den übergebenen Wert nicht nennt, untersuchen Sie ihn an der Aufrufstelle, indem Sie repr() und type() ausgeben:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

for char in "42":
    print(f"{char!r} has type {type(char).__name__}; its code point is {ord(char)}")
'4' has type str; its code point is 52
'2' has type str; its code point is 50

Jetzt ist die Unstimmigkeit sichtbar: Die Schleife übergibt chr() den String '4' (Typ str), während ord() die ganze Zahl zeigt, mit der es tatsächlich arbeitet — den Codepoint 52. Sobald Sie den tatsächlichen Typ und Wert des Arguments benennen können, ist die Wahl der richtigen Korrektur unkompliziert.

So korrigieren Sie die Eingabe sicher

Wählen Sie die Korrektur passend zu Ihrer Absicht:

  • Um Ziffern oder Zeichen aus einem String auszugeben, geben Sie den Wert direkt aus — print(char) benötigt überhaupt keinen chr()-Aufruf.
  • Um das an einem bestimmten Codepoint gespeicherte Zeichen zu erhalten, übergeben Sie chr() eine echte ganze Zahl. ord() liefert den Codepoint eines Zeichens, und int() wandelt eine Ziffernfolge in die Zahl um, die sie benennt. Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

for char in "42":
    print(char, "->", chr(ord(char)))
4 -> 4
2 -> 2

Bei Parametern wie maxlen, die aus einer Konfigurationsdatei oder der Kommandozeile stammen, wandeln Sie den Text einmal mit int() vor dem Aufruf um und übergeben das Ergebnis.

int() akzeptiert nur Strings, die wie ganze Zahlen aussehen. Prüfen Sie nicht vertrauenswürdige Eingaben zuerst mit str.isdigit(), damit ein ungültiger Wert die Umwandlung gar nicht erst erreicht:

text = "53"

if text.isdigit():
    print(chr(int(text)))
else:
    print("not a whole number")
5

Wenn eine Prüfung nicht ausreicht, behandeln Sie den Umwandlungsfehler direkt. int() auf einem ungeeigneten String löst ValueError aus, eine andere Ausnahme als der TypeError, mit dem Sie begonnen haben:

try:
    number = int("10.5")
except ValueError as error:
    print(f"{type(error).__name__}: {error}")
ValueError: invalid literal for int() with base 10: '10.5'

Die Korrektur prüfen und verwandte Typfehler vermeiden

Führen Sie den Code erneut aus und lesen Sie die letzte Zeile eines etwaigen verbleibenden Tracebacks — sie verrät Ihnen, ob noch ein Typproblem besteht oder ob Sie bereits zu einem anderen Fehler übergegangen sind. Wird maxlen als ganze Zahl übergeben, wird aus dem früheren Fehlschlag eine funktionierende Deque:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from collections import deque

queue = deque(["x", "y", "z"], maxlen=3)
queue.append("w")
print(list(queue))
['y', 'z', 'w']

Beachten Sie diese Punkte:

  • Stimmen Sie den Typ jedes Arguments auf die Signatur ab: chr() nimmt einen ganzzahligen Codepoint entgegen, ord() ein Zeichen, und int() wandelt einen numerischen String in eine ganze Zahl um.
  • Ein ValueError von int() ist nicht der TypeError, mit dem Sie begonnen haben — das Abfangen des einen verdeckt den anderen nicht; behandeln Sie beide jeweils an ihrer eigenen Quelle.
  • Meldungen wie can only concatenate oder unsupported operand type(s) beschreiben das Mischen von Typen in einem Ausdruck, nicht ein fehlerhaftes Argument; sie erfordern eine andere Lösung.

Der Fehler ist ein Wegweiser, keine Sackgasse: Sobald Sie wissen, welcher Wert den falschen Typ hatte, folgt die richtige Umwandlung — oder gar keine Umwandlung — meist unmittelbar.