HOWTO · Python

Beheben Sie den TypeError: Not All Arguments Converted While String Formatting in Python

Dieser Artikel erklärt, warum Python den TypeError: not all arguments converted during string formatting auslösen kann, wenn beim Formatieren mit `%` überzählige Werte von den Formatbezeichnern nicht verarbeitet werden. Sie erfahren, wie sich numerischer Modulo von der Zeichenfolgenformatierung unterscheidet, wie Sie Datentypen und die Anzahl der Platzhalter und Werte prüfen und wann `%`, `.format()` oder F-Strings geeignet sind.

Auf dieser Seite

Der Fehler TypeError: not all arguments converted during string formatting bedeutet normalerweise, dass Python % als Zeichenfolgenformatierung im alten Stil behandelt hat und Werte vorliegen, für die die Formatbezeichner der Zeichenfolge keine Platzhalter verbraucht haben. Derselbe Operator berechnet auch den numerischen Modulo. Deshalb sind Typ und Position der Operanden entscheidend: Steht links von % eine Zeichenfolge, wird sie formatiert. Prüfen Sie zuerst diese Operation und anschließend, ob zu jedem Platzhalter ein passender Wert gehört. Die folgenden Beispiele zeigen, wie Sie die Fälle unterscheiden und einen einheitlichen Formatierungsstil wählen.

Was dieser TypeError bedeutet

Bei Zahlen liefert % den Rest einer Division. Steht links eine Zeichenfolge, formatiert % sie im alten Stil: Platzhalter wie %s und %d geben an, welche Werte in die Zeichenfolge eingefügt werden. Die Bedeutung des Ausdrucks hängt daher vom linken Operanden ab und nicht davon, ob der rechte Operand wie eine Zahl aussieht.

Eine Zeichenfolge wie "19" bleibt Text. Bei "19" % 10 interpretiert Python die linke Seite als Formatzeichenfolge. Da sie keinen Platzhalter enthält, der den Wert 10 aufnehmen könnte, wird TypeError: not all arguments converted during string formatting gemeldet. Wenn Sie den Rest berechnen möchten, wandeln Sie den Text zuerst in eine Ganzzahl um. Wenn Sie Text in eine Meldung einfügen möchten, verwenden Sie stattdessen einen Formatplatzhalter.

Prüfen, wie der Operator % verwendet wird

Ein häufiger Grund ist, % auf Text anzuwenden, der von input() stammt oder in Anführungszeichen steht. Wandeln Sie numerische Eingaben mit int() um, bevor Sie den Modulo berechnen. Wenn Sie dagegen eine Zeichenfolge formatieren möchten, lassen Sie sie links stehen und fügen Sie einen passenden Platzhalter ein.

Führen Sie dieses Beispiel aus:

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

message = "%s scored %d points." % ("Mina", 18)
print(message)

Das Beispiel formatiert einen Namen und eine Ganzzahl. Die Ausgabe lautet Mina scored 18 points.

Für eine numerische Modulo-Berechnung müssen Sie die Eingabe vorher umwandeln. Dieses Beispiel fängt den Fehlertext der nicht umgewandelten Zeichenfolge ab und zeigt anschließend das numerische Ergebnis:

age_text = "19"
try:
    age_text % 10
except TypeError as error:
    print(type(error).__name__ + ": " + str(error))

age = int(age_text)
print(age % 10)

Der Aufruf int() wandelt die Ziffern in eine Ganzzahl um. Es handelt sich um eine Umwandlungsfunktion, nicht um einen Zeichenfolgen-Formatbezeichner. Zeichenfolgen mit nicht numerischem Inhalt lassen sich auf diesem Weg nicht umwandeln. Prüfen Sie daher nicht vertrauenswürdige Eingaben oder behandeln Sie mögliche Umwandlungsfehler.

Formatbezeichner und Werte aufeinander abstimmen

Bei der Formatierung im alten Stil muss es für jeden Platzhalter einen passenden Wert geben. Ist die rechte Seite ein Tupel, wird jeder Wert der Reihe nach einem Platzhalter zugeordnet. Gibt es mehr Werte als Platzhalter, kann ein nicht verwendeter Wert den gesuchten TypeError auslösen. Bei weniger Werten meldet Python einen anderen Formatierungsfehler; nicht jede Abweichung bei der Anzahl führt zu derselben Meldung.

Zwei %s-Platzhalter benötigen beispielsweise zwei Werte. Entfernen Sie einen überzähligen Wert oder ergänzen Sie einen Platzhalter, wenn der zusätzliche Wert in das Ergebnis gehört. Verwenden Sie %s für Text und %d für eine Ganzzahl. Wählen Sie einen zum Wert passenden Formatbezeichner, statt anzunehmen, dass jede Abweichung dieselbe Ursache hat.

Immer nur einen Zeichenfolgen-Formatierungsstil verwenden

Die Formatierung mit % verarbeitet Platzhalter wie %s oder %d. Die Methode .format() verarbeitet geschweifte Klammern wie {}. Für die Formatierung mit % sind Klammern allein gewöhnliche Zeichen. Eine Zeichenfolge mit {0} verarbeitet daher keinen Wert, der an % übergeben wird.

Wählen Sie für den Ausdruck eine Methode. Mit .format() rufen Sie die Methode auf der Vorlage auf und übergeben ihr die Werte. Mit % setzen Sie passende Prozent-Platzhalter in die Vorlage und geben die Werte rechts davon an. F-Strings sind eine weitere Möglichkeit, sofern die verwendete Python-Version sie unterstützt. Verwenden Sie eine Vorlage mit geschweiften Klammern nicht mit % in der Erwartung, dass beide Platzhalterarten verarbeitet werden.

Den korrigierten Ausdruck überprüfen

Lesen Sie den Ausdruck von links nach rechts: Bestimmen Sie den Typ des linken Operanden, entscheiden Sie, ob % den Modulo berechnet oder eine Zeichenfolge formatiert, zählen Sie die Platzhalter und vergleichen Sie sie mit den übergebenen Werten. Führen Sie dann den kleinstmöglichen korrigierten Ausdruck aus und prüfen Sie das Ergebnis. Erscheint die gesuchte Meldung weiterhin, prüfen Sie, ob Werte überzählig sind oder eine Zeichenfolge verwendet wird, obwohl eine Zahl gemeint ist. Ändert sich die Meldung, untersuchen Sie den neuen Fehler separat.

Weitere Einzelheiten, auch zur Formatierung von Zeichenfolgen im alten Stil, finden Sie in der Python-Dokumentation zu Ein- und Ausgabe.