Python TypeError: Nicht genügend Argumente für die Formatzeichenfolge

137

Hier ist die Ausgabe. Dies sind utf-8-Zeichenfolgen, von denen ich glaube ... einige davon können NoneType sein, aber es schlägt sofort fehl, bevor solche ...

instr = "'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % softname, procversion, int(percent), exe, description, company, procurl

TypeError: Nicht genügend Argumente für die Formatzeichenfolge

Es ist 7 für 7?

y2k
quelle

Antworten:

177

Beachten Sie, dass die %Syntax zum Formatieren von Zeichenfolgen veraltet ist. Wenn Ihre Version von Python dies unterstützt, sollten Sie schreiben:

instr = "'{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}'".format(softname, procversion, int(percent), exe, description, company, procurl)

Dies behebt auch den Fehler, den Sie zufällig hatten.

Simeon Visser
quelle
Funktioniert dies auch für das Protokollierungsmodul? Wird diese Art der Interpolation darunter verstanden?
AllTradesJack
@ Joshsvoss: Ja, hier werden einige Links erwähnt, die die Möglichkeiten diskutieren: bugs.python.org/issue14031
Simeon Visser
4
@SimeonVisser, warum ist das veraltet? Wenn Sie beispielsweise eine Variable zum Speichern der Formatzeichenfolge verwenden und eine Zeichenfolge mit ersetzten Werten in dieselbe Variable einfügen möchten, erhalten Sie nur einen etwas saubereren Code mit format_string% = ('bla', 'bla', 'bla'). . Möchten Sie dies näher erläutern oder auf einen nützlichen Link verweisen?
Djuka
.format () wurde hinzugefügt, da dies häufig vorkommt und kein Operator erforderlich sein sollte. Ihr Beispiel ist nett, aber für einen Neuling schwer zu erklären. Die Notation a = a.format (1,2,3) ist viel expliziter und leichter zu verstehen / zu lehren. Ich habe keinen Link, aber dies ist der Hauptgrund, warum format () eingeführt wurde (leicht verständlich).
Simeon Visser
1
Außerdem unterstützt format () explizitere Ausdrucksmöglichkeiten, z. B. "{a} {b}". Format (a = '3', b = '4').
Simeon Visser
240

Sie müssen die Formatargumente in ein Tupel einfügen (Klammern hinzufügen):

instr = "'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % (softname, procversion, int(percent), exe, description, company, procurl)

Was Sie derzeit haben, entspricht dem Folgenden:

intstr = ("'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % softname), procversion, int(percent), exe, description, company, procurl

Beispiel:

>>> "%s %s" % 'hello', 'world'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> "%s %s" % ('hello', 'world')
'hello world'
Andrew Clark
quelle
3
Das hat funktioniert. Ich habe versucht, die Formatierung von% s zu verwenden, um den NoneType-Fehler zu vermeiden, aber ich erhalte ihn immer noch. Siehe auch
y2k
Wird für das OP angesichts des Alters nicht nützlich sein, aber nur für den Fall, dass es für jemanden noch nützlich ist: Eine einfache Problemumgehung, bei der eine Variable keine sein kann, besteht darin, sich mit einer ternären Anweisung dagegen zu schützen - dh "% s% s"% ( a wenn a nicht niemand anderes ist "", b) wenn wir uns Sorgen machen, dass möglicherweise keiner ist. Selbst wenn a None ist, übergeben wir None dennoch nicht an den Formatoperator und verursachen Probleme.
Blair
21

Ich habe den gleichen Fehler bei der Verwendung %als Prozentzeichen in meiner Formatzeichenfolge erhalten. Die Lösung hierfür besteht darin, die zu verdoppeln %%.

Bruce Jakeway
quelle
4
Es kann hilfreich sein, einige Codebeispiele bereitzustellen, wie Ihre Lösung funktioniert und wie sie ohne sie fehlschlägt usw. Siehe Wie schreibe ich eine gute Antwort? . Beachten Sie, dass dies eine 5 Jahre alte Frage ist. Sie sollten daher nur dann eine Antwort hinzufügen, wenn sie wesentlich mehr Informationen enthält als die bereits vorhandenen.
Ramon
Ich habe eine Variation dieses Fehlers aufgrund eines Tippfehlers erhalten:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall
Für Python3 ist diese "Lösung" falsch -> Ungültige Syntax
JonyD