Resuelva el TypeError: no todos los argumentos se convirtieron durante el formato de cadena en Python

Shikha Chaudhary 21 junio 2023
  1. Causas y soluciones para Error de tipo: no todos los argumentos se convirtieron durante el formateo de cadenas en Python
  2. Conclusión
Resuelva el TypeError: no todos los argumentos se convirtieron durante el formato de cadena en Python

El formateo de cadenas en Python se puede hacer de varias maneras, y un operador de módulo (%) es uno de esos métodos. Es uno de los métodos más antiguos de formateo de cadenas en Python, y usarlo de manera incorrecta puede causar que ocurra el Error de tipo: no todos los argumentos se convirtieron durante el formateo de cadenas.

No solo eso, muchas otras razones pueden causar lo mismo. Aprendamos más sobre este error y las posibles soluciones para solucionarlo.

TypeError es una excepción de Python que surge cuando intentamos operar en tipos de objetos no admitidos. Hay muchos escenarios en los que podemos obtener este error, pero en este artículo, veremos el TypeError de Python que ocurre por el formato incorrecto de las cadenas.

Sin más preámbulos, ¡comencemos!

Causas y soluciones para Error de tipo: no todos los argumentos se convirtieron durante el formateo de cadenas en Python

Hay muchas razones por las que el TypeError: no todos los argumentos convertidos durante el formateo de cadenas puede ocurrir en Python. Discutámoslos uno por uno, junto con las posibles soluciones.

Operaciones en el tipo de datos incorrecto en Python

Mira el ejemplo que se da a continuación. Aquí, tomamos la edad del usuario como entrada y luego usamos el operador de módulo (%).

El resultado se almacena en la variable ans, que luego se formatea en la cadena en la instrucción print. Pero cuando ejecutamos este código, obtenemos el TypeError.

Esto sucede porque Python toma la entrada en forma de cadena. Esto significa que el valor 19 tomado como entrada es considerado el tipo de datos str por Python.

Pero, ¿podemos usar un operador de módulo (%) en una cadena? No, y por lo tanto, obtenemos este error.

age = input("Enter your age: ")
ans = age % 10
print("Your lucky number is:", ans)

Producción :

Enter your age: 19
Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: not all arguments converted during string formatting

Para arreglar esto, debemos tomar la entrada como un número entero usando la función int(). Esto se hace a continuación.

age = int(input("Enter your age: "))
ans = age % 10
print("Your lucky number is:", ans)

Producción :

Enter your age: 19
Your lucky number is: 9

Puede ver que esta vez obtenemos el resultado deseado ya que la función int() convierte la entrada a un tipo de datos entero, y podemos usar el operador de módulo (%) en él.

Ausencia de especificador de formato con el operador de interpolación de cadenas en Python

Este caso es un poco similar al que discutimos anteriormente. Mira el ejemplo que se da a continuación.

El resultado nos muestra que el error ocurrió en la línea 2. Pero, ¿puedes adivinar por qué?

La respuesta es simple. Sabemos que cualquier cosa dentro de comillas simples o dobles en Python es una cadena.

Aquí, el valor 19 está entre comillas dobles, lo que significa que es un tipo de datos de cadena y no podemos usar el operador de módulo (%) en él.

age = "19"
if age % 10:
    print("Your age is a lucky number")

Producción :

Traceback (most recent call last):
  File "<string>", line 2, in <module>
TypeError: not all arguments converted during string formatting

Para rectificar esto, usaremos el especificador de formato int(), como se hace a continuación.

age = "19"
if int(age) % 10:
    print("Your age is a lucky number")

Producción :

Your age is a lucky number

Esta vez el código funciona bien.

Número desigual de especificadores de formato y valores en Python

Sabemos que colocamos tantos especificadores de formato durante el formateo de cadenas como el número de valores a formatear. Pero, ¿qué sucede si hay más o menos valores que el número de especificadores de formato especificados dentro de la cadena?

Mira este código. Aquí, tenemos tres variables y queremos insertar solo dos de ellas en la cadena.

Pero cuando pasamos los argumentos en la instrucción print, pasamos los tres, lo que sin duda da como resultado el TypeError.

lead_actor = "Harry Potter"
co_actor = "Ron Weasley"
actress = "Hermione Granger"

print("The males in the main role were: %s and %s." % (lead_actor, co_actor, actress))

Producción :

Traceback (most recent call last):
  File "<string>", line 5, in <module>
TypeError: not all arguments converted during string formatting

Eliminemos la última variable, actriz, de la lista de argumentos y luego volvamos a ejecutar este programa.

lead_actor = "Harry Potter"
co_actor = "Ron Weasley"
actress = "Hermione Granger"

print("The males in the main role were: %s and %s." % (lead_actor, co_actor))

Producción :

The males in the main role were: Harry Potter and Ron Weasley.

Puede ver que esta vez el código funciona bien porque la cantidad de especificadores de formato dentro de la cadena es igual a la cantidad de variables pasadas como argumentos.

Tenga en cuenta que el especificador de formato que se utilizará depende del tipo de datos de los valores, que en este caso es %s ya que estamos tratando con el tipo de datos de cadena.

Uso de diferentes especificadores de formato en la misma cadena en Python

Sabemos que hay varias formas en las que podemos formatear una cadena en Python, pero una vez que elige un método, debe seguir solo ese método en una sola cadena. En otras palabras, no puede mezclar diferentes tipos de métodos de formato de cadena en una sola declaración porque conducirá al Error de tipo: no todos los argumentos se convirtieron durante el formato de cadena.

Mire el código a continuación para comprender mejor este concepto.

Estamos usando marcadores de posición ({}) dentro de la cadena para formatear esta cadena, pero no pasamos los argumentos como una tupla como hicimos antes. En cambio, una de las variables está precedida por un operador de módulo (%), mientras que la otra no lo está.

Esto es lo que lleva al TypeError.

lead_actor = "Harry Potter"
co_actor = "Ron Weasley"
actress = "Hermione Granger"

print("The males in the main role were: {0} and {1}." % lead_actor, co_actor)

Producción :

Traceback (most recent call last):
  File "<string>", line 5, in <module>
TypeError: not all arguments converted during string formatting

Para solucionar esto, podemos hacer dos cosas.

  1. Si desea utilizar marcadores de posición ({}) dentro de la cadena, debe utilizar el método format() con el operador de punto (.) para pasar los argumentos. Esto se hace a continuación.

    lead_actor = "Harry Potter"
    co_actor = "Ron Weasley"
    actress = "Hermione Granger"
    
    print("The males in the main role were: {0} and {1}.".format(lead_actor, co_actor))
    

    Producción:

    The males in the main role were: Harry Potter and Ron Weasley.
    

    Puedes ver que esta vez el código funciona bien.

  2. La otra forma podría ser eliminar el uso de marcadores de posición ({}) y usar especificadores de formato en su lugar junto con pasar los argumentos como una tupla precedida por el operador de módulo (%). Esto se hace de la siguiente manera.

    lead_actor = "Harry Potter"
    co_actor = "Ron Weasley"
    actress = "Hermione Granger"
    
    print("The males in the main role were: %s and %s." % (lead_actor, co_actor))
    

    Producción:

    The males in the main role were: Harry Potter and Ron Weasley.
    

    Tenga en cuenta que el operador de módulo (%) para formatear es un estilo antiguo mientras que, por otro lado, el uso de marcadores de posición con el método .format() es un método de formato de cadena de nuevo estilo en Python.

Esto es todo por este artículo. Para obtener más información sobre el formato de cadenas en Python, consulte esta documentación.

Conclusión

En este artículo, hablamos sobre las diversas razones que conducen a Error de tipo: no todos los argumentos se convirtieron durante el formateo de cadenas en Python, junto con las posibles soluciones.

Artículo relacionado - Python Error

Artículo relacionado - Python TypeError