Python TypeError: no hay suficientes argumentos para la cadena de formato

138

Aquí está la salida. Estas son cadenas utf-8, creo ... algunas de ellas pueden ser NoneType pero falla inmediatamente, antes de las que son así ...

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

TypeError: no hay suficientes argumentos para la cadena de formato

Sin embargo, es 7 por 7?

y2k
fuente

Respuestas:

177

Tenga en cuenta que la %sintaxis para formatear cadenas se está volviendo obsoleta. Si su versión de Python lo admite, debe escribir:

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

Esto también corrige el error que sucedió.

Simeon Visser
fuente
¿Funciona esto también para el módulo de registro? ¿Es este tipo de interpolación entendido por él?
AllTradesJack
@joshsvoss: sí, hay algunos enlaces mencionados aquí que analizan las posibilidades: bugs.python.org/issue14031
Simeon Visser
44
@SimeonVisser, ¿por qué esto se está volviendo obsoleto? Si, por ejemplo, usa una variable para almacenar cadenas de formato y desea colocar cadenas con valores reemplazados en la misma variable, obtendrá un código un poco más limpio con format_string% = ('bla', 'bla', 'bla') . ¿Te importaría elaborar o señalar algún enlace útil sobre esto?
Djuka
.format () se agregó porque esto es bastante común y no debería requerir que lo haga un operador. Su ejemplo es agradable pero difícil de explicar a un recién llegado. La notación a = a.format (1,2,3) es mucho más explícita y más fácil de entender / enseñar. No tengo un enlace, pero esta es la razón principal por la que se introdujo el formato () (facilidad de comprensión).
Simeon Visser
1
Además, format () admite formas más explícitas de expresar lo que sucede, como "{a} {b}". Format (a = '3', b = '4').
Simeon Visser
240

Debe poner los argumentos de formato en una tupla (agregar paréntesis):

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

Lo que tiene actualmente es equivalente a lo siguiente:

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

Ejemplo:

>>> "%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
fuente
3
Eso funcionó ... una especie de. Intenté usar el formato% s para evitar el error NoneType, pero todavía lo estoy obteniendo. Relacionado: stackoverflow.com/questions/1338690/…
y2k
No será útil para el OP, dada la edad, pero por si acaso sigue siendo útil para alguien: una solución simple donde una variable puede ser ninguna es protegerse contra eso con una declaración ternaria, es decir, "% s% s"% ( a si a no es Ninguno más "", b) si estamos preocupados por un posible ser Ninguno. Entonces, incluso si a es None, todavía no estamos pasando None al operador de formato y causando problemas.
Blair
21

Obtuve el mismo error cuando lo uso %como un carácter de porcentaje en mi cadena de formato. La solución a esto es duplicar el %%.

Bruce Jakeway
fuente
44
Puede ser útil proporcionar algunos ejemplos de código sobre cómo funciona su solución y cómo falla sin ella, etc. Vea ¿Cómo escribo una buena respuesta? . Tenga en cuenta que esta es una pregunta de 5 años, por lo que debe agregar una respuesta solo si proporciona significativamente más información que las que ya existen.
Ramon
"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Obtuve
Para python3 esta "solución" está mal -> Sintaxis inválida
JonyD