¿Por qué obtengo “TypeError: no todos los argumentos convertidos durante el formateo de cadenas” al intentar formatear una tupla?

6 minutos de lectura

avatar de usuario de veturi
veturi

Quiero usar %formato de cadena de estilo para imprimir una tupla:

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

Espero que se imprima como This is a tuple: (1,2,3).pero en su lugar me sale un error que dice TypeError: not all arguments converted during string formatting.

¿Qué está mal y cómo lo soluciono?


Al editar esta pregunta para mayor claridad y modernización, conservé un aspecto interesante del ejemplo original: los paréntesis alrededor tup. Estos son no es necesario Para el % sintaxis, y también no crees una tupla. Es posible que OP entendiera que el ajuste de tupla (descrito en las respuestas aquí) era necesario, pero simplemente se equivocó. Para obtener más información sobre ese problema, consulte Cómo crear una tupla “singleton” con un solo elemento.

Avatar de usuario de Alex Martelli
alex martelli

>>> 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í.

  • En Python 3, la impresión es una función, no una declaración, por lo que debe escribir print(....).

    – Jürgen Gmach

    16 mayo 2020 a las 17:09

Avatar de usuario de Antimony
Antimonio

El % la sintaxis es obsoleta. Usar str.formatque es más simple y más legible:

t = 1,2,3
print('this is a tuple: {0}.'.format

  • Agregué un comentario a este stackoverflow.com/a/26249755/1676424 para el caso de 1 artículo tuple

    – Jacob CUI

    8 de octubre de 2014 a las 5:29

  • nunca supe porque % es obsoleto pero yo ahora siempre tu str.format de todos modos, a ciegas. No importa eso, estoy interesado en cuál es el calificador completo, porque el simple {0} no es el calificador completo, sino simplemente un indicador de posición. Por un intlo que yo llamo el calificador completo sería {0:d} (o {3:d} por ejemplo, si el int que se va a imprimir se encuentra en la cuarta posición en el str.format método). Intenté imprimir una tupla usando el {0:s} calificador pero no funciona. Entonces, ¿cuál es el calificador completo para algo como una tupla?

    – rayo

    24 de marzo de 2016 a las 11:53

  • @Ray Eso realmente no tiene sentido. Hay muchas opciones que puede especificar, que se pueden encontrar en la documentación. Si quieres imprimir algo usando str puedes decir {!s}, pero este es el valor predeterminado, por lo que no es necesario. Si quieres usar repr en cambio, puedes hacer {!r}. A diferencia de con %no hay necesidad de decir d para enteros.

    – Antimonio

    24 de marzo de 2016 a las 14:02


  • Me gusta % de sintaxis ya que es menos detallada para mi mente que el nuevo formato, y también muy similar al formato de cadena c que conozco y amo

    – Paulus

    24 de abril de 2016 a las 0:48

  • Tenga en cuenta que, incluso en Python 3, el % no está completamente obsoleto. De hecho, pylint incluso se quejará si usa el .format sintaxis dentro de la logging módulo: stackoverflow.com/a/34634301/534238

    –Mike Williamson

    20 jun 2018 a las 17:50

Avatar de usuario de Fong Kah Chun
Fong Kah Chun

La forma correcta de hacerlo es:

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

El % El operador de cadena todavía es compatible con Python 3.x y facilita el formateo de una tupla (o lista) como valores separados. Usando .format para este caso, se requerirá algo de trabajo adicional: los valores deben pasarse como argumentos separados o la secuencia deberá indexarse:

>>> tup = (1,2,3)
>>> print("First: %d, Second: %d, Third: %d" % tup)
First: 1, Second: 2, Third: 3
>>> print('First: {}, Second: {}, Third: {}'.format(1,2,3))
First: 1, Second: 2, Third: 3
>>> print('First: {0[0]}, Second: {0[1]}, Third: {0[2]}'.format(tup))
First: 1, Second: 2, Third: 3

El % El operador también es útil para validar el tipo de los argumentos, utilizando diferentes códigos de formato (%s, %d, %i), mientras que .formato() solo admite dos banderas de conversión: '!s' y '!r'.

  • Hice la transición a usar format() pero esta ventaja del método % (poder formatear cada elemento de una tupla y hacer conversiones) es grande, así que creo que regresaré. Gracias.

    – Factura

    15 de julio de 2017 a las 18:03

  • También puede especificar el formato para cada elemento. ‘{:d}{:s}’.formato(1, ‘2’)

    – zk82

    3 de enero de 2018 a las 15:58


  • La tupla “asterisco desempaquetado” funciona bien con .format: tup = (1,2,3); print('First: {}, Second: {}, Third: {}'.format(*tup)).

    – mdz

    23 de agosto de 2018 a las 8:53

  • Esto está mal. El .format la sintaxis permite la verificación de tipos. !s y !r son una característica separada. Podemos especificar el tipo requerido con, por ejemplo '{:d}'.format(x)que funcionará solo cuando x es un número entero.

    – Karl Knechtel

    4 abr a las 0:58

Avatar de usuario de Vinay Sajip
Vinay Sajip

>>> tup = (1, 2, 3)
>>> print "Here it is: %s" % (tup,)
Here it is: (1, 2, 3)
>>>

Aquí, (tup,) – con la coma final – es una tupla que contiene una tupla. La tupla exterior es el argumento del operador %. La tupla interior es su contenido, que en realidad se imprime. Sin la coma final, (tup) es lo mismo que tup – los paréntesis son solo paréntesis de agrupación normales.

Avatar de usuario de JE_Muc
JE_Muc

Aunque esta pregunta es bastante antigua y tiene muchas respuestas diferentes, todavía me gustaría agregar la respuesta más “pitónica” y también legible/concisa.

Dado que Antimony ya muestra correctamente el método general de impresión de tuplas, esta es una adición para imprimir cada elemento en una tupla por separado, como Fong Kah Chun ha demostrado correctamente con el %s sintaxis.

Curiosamente, solo se ha mencionado en un comentario, pero el uso de un operador de asterisco para desempaquetar la tupla produce una flexibilidad y legibilidad completas utilizando el str.format método cuando imprimir elementos de tupla por separado.

tup = (1, 2, 3)
print('Element(s) of the tuple: One {0}, two {1}, three {2}'.format(*tup))

Esto también evita imprimir una coma al final cuando se imprime una tupla de un solo elemento, como lo evita Jacob CUI con replace. (Aunque en mi humilde opinión, la representación de la coma final es correcta si desea conservar la representación del tipo al imprimir):

tup = (1, )
print('Element(s) of the tuple: One {0}'.format(*tup))

Avatar de usuario de Karl Knechtel
Carlos Knechtel

Además de los métodos propuestos en las otras respuestas, desde Python 3.6 también podemos usar Interpolación de cadenas literales (cuerdas f):

>>> tup = (1,2,3)
>>> print(f'this is a tuple: {tup}.')
this is a tuple: (1, 2, 3).

t = (1, 2, 3)

# the comma (,) concatenates the strings and adds a space
print "this is a tuple", 

# format is the most flexible way to do string formatting
print "this is a tuple {0}".format

# classic string formatting
# I use it only when working with older Python versions
print "this is a tuple %s" % repr
print "this is a tuple %s" % str

¿Ha sido útil esta solución?