HOWTO · Python
Beheben den TypeError: must be str, not int Fehler in Python
Erfahren Sie, wie Sie TypeError: must be str, not int in Python beheben
Auf dieser Seite
TypeError: must be str, not int bedeutet, dass eine Operation Text erwartet, aber eine Ganzzahl erhalten hat. Eine häufige Ursache ist die Verkettung mit +: Python kann Zeichenketten verketten, wenn beide Operanden Zeichenketten sind, wandelt eine Zahl aber nicht automatisch in Text um. Zum Beispiel löst "Count: " + 3 diesen Fehler aus. Dasselbe Problem kann bei einer Fließkommazahl, einem booleschen Wert oder einem anderen Wert auftreten, der keine Zeichenkette ist.
Der Fehler betrifft die Typen der Operanden einer Operation, nicht die Frage, ob die Ganzzahl sinnvoll ist. Entscheide vor einer Änderung des Werts, ob du Text oder eine arithmetische Berechnung möchtest. Soll der Wert für Vergleiche, Additionen oder andere Berechnungen numerisch bleiben, lass ihn als Zahl und formatiere ihn erst für die Anzeige.
Warum Python TypeError: must be str, not int auslöst
Der Operator + kann Zahlen addieren oder Zeichenketten verketten – je nach Typ der Operanden. Ist ein Operand eine Zeichenkette und der andere eine Ganzzahl, kann Python nicht erkennen, ob du die Ziffern der Zahl anhängen oder eine numerische Berechnung ausführen möchtest. Deshalb meldet Python den Typkonflikt, statt stillschweigend eine Umwandlung vorzunehmen.
Dieses Minimalbeispiel fängt die fehlerauslösende Operation ab, damit das Skript weiterlaufen kann, und gibt anschließend die resultierende Fehlermeldung aus. Das Codebeispiel und die angezeigte Fehlermeldung bleiben auf Englisch:
try:
result = "Count: " + 3
except TypeError as error:
message = f"{type(error).__name__}: {error}"
print(message)
TypeError: can only concatenate str (not "int") to str
Um den gewünschten Text zu erzeugen, wandle zuerst die Ganzzahl um. Der korrigierte Ausdruck lautet "Count: " + str(3) und ergibt Count: 3.
Für die eingebaute Funktion join() gilt eine ähnliche Regel: Das Eingabe-Iterable muss Zeichenketten enthalten. Ganzzahlen werden nicht automatisch umgewandelt. Verwende die Funktion, wenn die Bestandteile bereits Text sind, und wandle Werte gezielt um, wenn du ihre Textdarstellung benötigst.
Werte prüfen, bevor du Zeichenketten verknüpfst
Suche den Ausdruck, der Text mit einem anderen Wert kombiniert, und prüfe jeden Operanden unmittelbar vor diesem Ausdruck. type(value).__name__ gibt den Laufzeittyp an; durch Ausgeben oder Untersuchen des Werts lässt sich feststellen, was er enthält. Führe dieses Beispiel aus. Der Code und die angezeigte Ausgabe bleiben auf Englisch:
label = "Order"
number = 1923
print(f"{label} #{number}")
Das Beispiel gibt Folgendes aus:
Order #1923
Um den gemischten Ausdruck zu untersuchen, gib unmittelbar vor dem Verknüpfen beide Operanden samt ihren Typen aus. Dieses Beispiel fängt die Ausnahme ab und gibt anschließend ihre Meldung zusammen mit den Diagnosewerten aus. Code und Ausgabe bleiben auf Englisch:
label = "Count: "
count = 3
print(f"left={label!r} ({type(label).__name__})")
print(f"right={count!r} ({type(count).__name__})")
try:
message = label + count
except TypeError as error:
error_message = f"{type(error).__name__}: {error}"
print(error_message)
left='Count: ' (str)
right=3 (int)
TypeError: can only concatenate str (not "int") to str
Die Zeile left zeigt eine str mit dem Wert 'Count: ' an, während right eine int mit dem Wert 3 ausweist. Diese Ganzzahl ist der Operand, der sich nicht direkt mit der Zeichenkette verketten lässt. Die letzte Zeile zeigt die resultierende Meldung TypeError an.
Prüfe bei einem fehlerhaften Ausdruck beide Seiten von +, statt alle Werte im umgebenden Programm zu ändern. Hinter einem Variablennamen kann sich ein Wert verbergen, der keine Zeichenkette ist. Auch ein Wert aus einer Eingabe, einer Datei oder einer API kann einen anderen Typ haben als erwartet. Die Angabe int verweist auf einen Ganzzahloperanden; durch Untersuchen des Ausdrucks findest du heraus, welche Variable ihn liefert.
Einen Wert mit str() umwandeln, wenn Text gewünscht ist
Rufe str(value) auf, wenn das Ergebnis Text sein soll, etwa als Beschriftung in einem Bericht oder als Nachricht. Die Funktion gibt eine Zeichenkettendarstellung zurück; der umgewandelte Wert behält seinen ursprünglichen Typ nicht bei. Das ist für die Anzeige nützlich, aber die falsche Lösung, wenn der Wert später addiert, verglichen oder anderweitig als Zahl verarbeitet werden muss.
Das Codebeispiel und die Ausgabe bleiben auf Englisch:
count = 1923
message = "Count: " + str(count)
print(message)
Count: 1923
Bei Listen und anderen Objekten erzeugt str() eine für Menschen lesbare Darstellung, aber kein Serialisierungsformat, dessen Eignung zum Speichern oder Übertragen garantiert ist. Die Darstellung eines benutzerdefinierten Objekts stammt von seiner Methode __str__(), sofern sie definiert ist; andernfalls greift Python auf sein allgemeines Darstellungsverhalten zurück. Gehe nicht davon aus, dass die Umwandlung einen ausformulierten Satz oder ein Format erzeugt, das ein anderes Programm sicher parsen kann.
Text und Werte mit einem f-String kombinieren
Ein f-String ist oft die klarste Wahl, wenn du aus festem Text und Werten eine Nachricht bilden möchtest. Stelle der Zeichenkette f voran und setze Ausdrücke in geschweifte Klammern. Python formatiert jeden Wert für die Zeichenkette. Für die normale Anzeige ist daher kein zusätzlicher Aufruf von str() nötig.
Das Codebeispiel und die Ausgabe bleiben auf Englisch:
count = 1923
price = 12.5
message = f"Count: {count}; price: {price}"
print(message)
Count: 1923; price: 12.5
Ausdrücke in geschweiften Klammern werden beim Formatieren ausgewertet. Halte sie so einfach, dass sie gut lesbar bleiben; berechne komplizierte Werte vorher in benannten Variablen. Wie bei str() entsteht durch das Formatieren Text. Bewahre deshalb die ursprünglichen numerischen Variablen auf, wenn das Programm sie weiterhin als Zahlen verarbeiten muss.
Die passende Lösung für deine Daten wählen
Verwende str() oder einen f-String, wenn das gewünschte Ergebnis eine Nachricht ist. Ein f-String eignet sich besonders, wenn du mehrere Werte mit Beschriftungen kombinierst. str() verwendest du, wenn eine Zeichenkettenumwandlung Teil einer größeren Operation sein soll. Sollen die Werte mathematisch addiert werden, wandle sie in Zahlen um oder überprüfe ihren Zahlentyp, statt ihre Ziffern an Text anzuhängen.
Bei join() solltest du jedes Element nur dann ausdrücklich umwandeln, wenn eine Textliste gewünscht ist. Ein Generatorausdruck erledigt das, ohne eine Zwischenliste zu erstellen. Das Codebeispiel und die Ausgabe bleiben auf Englisch:
values = [1923, 12, 5]
text = ", ".join(str(value) for value in values)
print(text)
Dadurch wird jedes Element vor dem Verknüpfen in seine Anzeigedarstellung umgewandelt. Sollen die Elemente Zahlen bleiben, führe zuerst die numerischen Berechnungen aus und formatiere anschließend das Endergebnis. So passt die Lösung zum Zweck der Daten, statt einen Typkonflikt zu verschleiern.