¿Por qué obtengo “Error de tipo: no todos los argumentos se convirtieron durante el formato de cadena” al intentar sustituir un marcador de posición como {0} usando %?

5 minutos de lectura

avatar de usuario de user2652300
usuario2652300

Tengo un código que leerá dos cadenas del usuario:

name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")

Más tarde, quiero formatear esas cadenas en una cadena más larga para imprimir:

if len(name1) > len(name2):
    print ("'{0}' is longer than '{1}'"% name1, name2)

Pero recibo un mensaje de error que se ve así:

Traceback (most recent call last):
  File "program.py", line 13, in <module>
    print ("'{0}' is longer than '{1}'"% name1, name2)
TypeError: not all arguments converted during string formatting

¿Qué está mal con el código? ¿Cómo debo escribir esta línea en su lugar para formatear la cadena correctamente?


Consulte también Formato de cadena: % frente a .formato frente a f-string literal para una comparación detallada de las formas más comunes de hacer este tipo de formato de cadena y ¿Cómo coloco el valor de una variable dentro de una cadena (interpolarlo en el cadena)? para obtener una guía práctica general para este tipo de construcción de cuerdas. Consulte Imprimir tupla con formato de cadena en Python para conocer otra causa común del error.

avatar de usuario de nneonneo
neoneo

Viejo estilo % usos de formato % códigos para formatear:

# A single value can be written as is:
'It will cost $%d dollars.' % 95

# Multiple values must be provided as a tuple:
"'%s' is longer than '%s'" % (name1, name2)

Nuevo estilo {} usos de formato {} códigos y el .format método. Asegúrese de no mezclar y combinar, si la cadena “plantilla” contiene {} marcadores de posición, luego llame .formatno usar %.

# The values to format are now arguments for a method call,
# so the syntax is the same either way:
'It will cost ${0} dollars.'.format(95)

"'{0}' is longer than '{1}'".format(name1, name2)

  • en pitón 3.6: f"'It will cost ${your_variable} dollars."

    – JinSnow

    22 de marzo de 2017 a las 20:18

  • complemento del comentario de @JinSnow… si desea que también se imprima el nombre de la variable, f"'It will cost {your_variable=} dollars."

    – SamDaniel

    9 de noviembre de 2021 a las 9:56


avatar de usuario de leonh
leonh

La forma correcta de usar el formato de cadena tradicional usando el operador ‘%’ es usar una cadena de formato de estilo printf (documentación de Python para esto aquí: http://docs.python.org/2/library/string.html#format-string-syntax):

"'%s' is longer than '%s'" % (name1, name2)

Sin embargo, el operador ‘%’ probablemente quedará obsoleto en el futuro. El nuevo PEP 3101 forma de hacer las cosas es así:

"'{0}' is longer than '{1}'".format(name1, name2)

  • scnr: “probablemente quedará obsoleto en el futuro” no sucedió hasta ahora (Python 3.5). La antigua sintaxis ‘%’ no quedó obsoleta en 3.1 y solo en 3.2 módulo de registro aprendió cómo formatear con el nuevo estilo {}. Y de repente trae 3.5 PEP 461: % formato de bytes. Esto me hace pensar que % queda por mucho tiempo por venir.

    – cfi

    7 de enero de 2016 a las 16:03

  • % es más conciso. Me alegro de que se quede con nosotros.

    – Lenar Hoyt

    10 de junio de 2016 a las 10:36

  • Estoy de acuerdo. % es más conciso y eliminarlo no agregaría ningún beneficio al lenguaje.

    – perro de caza

    26 de diciembre de 2017 a las 16:13

  • @LenarHoyt ¿Cómo te sientes acerca de las cuerdas f? no puedo imaginar que eso sea "'%s' is longer than '%s'" % (name1, name2) más conciso que f"'{name1}' is longer than '{name2}'"

    –Mark Moretto

    16 de enero de 2020 a las 12:34

  • Estoy totalmente a favor de las cuerdas f, pero son demasiado nuevas y no puedes usarlas en un proyecto que tenga más de un año.

    – Darko Kolev

    29 de septiembre de 2020 a las 11:27

Avatar de usuario de Nick Brady
nick brady

Este error también se produce cuando se intenta formatear un solo valor en la cadena usando %si el valor es una tupla.

Como se muestra y explica en la respuesta de Alex Martelli allí:

>>> thetuple = (1, 2, 3)
>>> print("this is a tuple: %s" % (thetuple,))
this is a tuple: (1, 2, 3)

Hacer una tupla singleton con la tupla de interés como único elemento, es decir, el (thetuple,) parte, es la parte clave aquí.

  • Preferiría convertir la tupla en una cadena usando una de las siguientes declaraciones: print("this is a tuple: %s" % str(thetuple)) o print("this is a tuple: %s" % repr(thetuple))

    – Alex

    7 de marzo de 2017 a las 6:56

Tenga en cuenta que este error también podría deberse a que se olvidó de hacer referencia a la variable

"this is a comment" % comment #ERROR

en lugar de

"this is a comment: %s" % comment

Avatar de usuario de Tahir Musharraf
Tahir Musharraf

En python 3.7 y superior, hay una forma nueva y fácil. Se llama cuerdas f. Aquí está la sintaxis:

name = "Eric"
age = 74
f"Hello, {name}. You are {age}."

Producción:

Hello, Eric. You are 74.

  • Esto en realidad no responde la pregunta.

    – pimienta

    27 de junio de 2022 a las 18:29

avatar de usuario de azro
Azro

Para mí, como estaba almacenando muchos valores dentro de una sola llamada de impresión, la solución fue crear una variable separada para almacenar los datos como una tupla y luego llamar a la función de impresión.

x = (f"{id}", f"{name}", f"{age}")
print(x) 

  • Esto en realidad no responde la pregunta.

    – pimienta

    27 de junio de 2022 a las 18:29

avatar de usuario de sameer_nubia
sameer_nubia

La forma más fácil de encasillar el número de cadena a entero

number=89
number=int(89)

  • Esto se refiere a un problema no relacionado. Consulte, por ejemplo, stackoverflow.com/questions/15496408.

    – Karl Knechtel

    4 abr a las 0:39

¿Ha sido útil esta solución?