Python TypeError: argomenti insufficienti per la stringa di formato


138

Ecco l'output. Queste sono stringhe utf-8 credo ... alcune di queste possono essere NoneType ma falliscono immediatamente, prima di quelle così ...

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

TypeError: argomenti insufficienti per la stringa di formato

È 7 per 7 però?

Risposte:


177

Si noti che la %sintassi per la formattazione delle stringhe sta diventando obsoleta. Se la tua versione di Python lo supporta, dovresti scrivere:

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

Questo risolve anche l'errore che ti è capitato di avere.


Funziona anche con il modulo di registrazione? Questo tipo di interpolazione è compreso da esso?
AllTradesJack,

@joshsvoss: sì, ci sono alcuni link qui menzionati che discutono delle possibilità: bugs.python.org/issue14031
Simeon Visser

4
@SimeonVisser, perché questo sta diventando obsoleto? Se, ad esempio, si utilizza una variabile per memorizzare la stringa di formato e si desidera inserire una stringa con valori sostituiti nella stessa variabile, si ottiene solo un codice più pulito con format_string% = ('bla', 'bla', 'bla') . Ti interessa elaborare o indicare qualche link utile al riguardo?
Djuka,

.format () è stato aggiunto perché è abbastanza comune e non dovrebbe essere richiesto da un operatore. Il tuo esempio è carino ma difficile da spiegare a un nuovo arrivato. La notazione a = a.format (1,2,3) è molto più esplicita e più facile da capire / insegnare. Non ho un link, ma questo è il motivo principale per cui è stato introdotto format () (facilità di comprensione).
Simeon Visser,

1
Inoltre, format () supporta modi più espliciti per esprimere ciò che accade, come "{a} {b}". Format (a = '3', b = '4').
Simeon Visser,

240

Devi mettere gli argomenti del formato in una tupla (aggiungi parentesi):

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

Quello che hai attualmente è equivalente al seguente:

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

Esempio:

>>> "%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'

3
Che ha funzionato..sort di. Stavo cercando di utilizzare la formattazione% s per evitare l'errore NoneType, ma lo sto ancora ottenendo. Correlati: stackoverflow.com/questions/1338690/...
Y2K

Non sarà utile all'OP, data l'età, ma nel caso in cui sia ancora utile a qualcuno: una semplice soluzione in cui una variabile potrebbe non essere nulla è quella di proteggerla da un'istruzione ternaria, ovvero "% s% s"% ( a se a non è nessun altro "", b) se siamo preoccupati che un possibile essere nessuno. Quindi, anche se a è Nessuno, non stiamo ancora passando Nessuno all'operatore di formattazione e causando problemi.
Blair

21

Ho avuto lo stesso errore quando ho usato %come carattere percentuale nella mia stringa di formato. La soluzione a questo è raddoppiare il %%.


4
Fornire alcuni esempi di codice su come funziona la tua soluzione e su come fallisce senza di essa, ecc. Potrebbe essere utile. Vedi Come posso scrivere una buona risposta? . Nota che questa è una domanda di 5 anni, quindi dovresti aggiungere una risposta solo se fornisce molte più informazioni di quelle già presenti.
Ramon,

Ho avuto una variazione di questo errore a causa dell'errore di battitura:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall

Per python3 questa "soluzione" è sbagliata -> Sintassi non valida
JonyD
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.