TypeError: no todos los argumentos se convirtieron durante el formateo de cadenas de python

Se supone que el progtwig toma dos nombres, y si tienen la misma longitud, debe verificar si son la misma palabra. Si es la misma palabra, se imprimirá “Los nombres son los mismos” . Si tienen la misma longitud pero con letras diferentes se imprimirá “Los nombres son diferentes pero tienen la misma longitud” . La parte con la que estoy teniendo problemas está en las 4 líneas inferiores.

#!/usr/bin/env python # Enter your code for "What's In (The Length Of) A Name?" here. name1 = input("Enter name 1: ") name2 = input("Enter name 2: ") len(name1) len(name2) if len(name1) == len(name2): if name1 == name2: print ("The names are the same") else: print ("The names are different, but are the same length") if len(name1) > len(name2): print ("'{0}' is longer than '{1}'"% name1, name2) elif len(name1) < len(name2): print ("'{0}'is longer than '{1}'"% name2, name1) 

Cuando ejecuto este código muestra:

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

Cualquier sugerencia es altamente apreciada.

Estás mezclando diferentes funciones de formato.

El formato % estilo antiguo usa % códigos para el formato:

 'It will cost $%d dollars.' % 95 

El formato {} estilo nuevo utiliza códigos {} y el método .format

 'It will cost ${0} dollars.'.format(95) 

Tenga en cuenta que con el formato de estilo antiguo, debe especificar varios argumentos utilizando una tupla:

 '%d days and %d nights' % (40, 40) 

En su caso, ya que está utilizando los especificadores de formato {} , use .format :

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

El error está en su formato de cadena.

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

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

Sin embargo, el operador ‘%’ probablemente quedará en desuso en el futuro . La nueva forma de hacer las cosas del PEP 3101 es así:

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

Para mí, este error se produjo cuando intentaba pasar una tupla al método de formato de cadena.

Encontré la solución de esta pregunta / respuesta

Copiando y pegando la respuesta correcta desde el enlace (NO MI TRABAJO) :

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

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

En mi caso, es porque solo necesito un solo %s , me faltan valores de entrada.

Además de las otras dos respuestas, creo que las muescas también son incorrectas en las dos últimas condiciones. Las condiciones son que un nombre es más largo que el otro y deben comenzar con ‘elif’ y sin sangrías. Si lo pones dentro de la primera condición (dándole cuatro sangrías desde el margen), termina siendo contradictorio porque las longitudes de los nombres no pueden ser iguales y diferentes al mismo tiempo.

  else: print ("The names are different, but are the same length") elif len(name1) > len(name2): print ("{0} is longer than {1}".format(name1, name2)) 

Hay una combinación de problemas como se señala en algunas de las otras respuestas.

  1. Como lo señala nneonneo, está mezclando diferentes métodos de formato de cadenas.
  2. Como lo señaló GuyP, su sangría también está desactivada.

He proporcionado tanto el ejemplo de .format como el paso de tuplas al especificador de argumentos de% s. En ambos casos, la sangría se ha arreglado de modo que sea mayor / menor que las verificaciones fuera de cuando la longitud coincide. También se modificó posteriormente si las sentencias a elif, por lo que solo se ejecutan si la sentencia del mismo nivel anterior era Falso.

Formato de cadena con .format

 name1 = input("Enter name 1: ") name2 = input("Enter name 2: ") len(name1) len(name2) if len(name1) == len(name2): if name1 == name2: print ("The names are the same") else: print ("The names are different, but are the same length") elif len(name1) > len(name2): print ("{0} is longer than {1}".format(name1, name2)) elif len(name1) < len(name2): print ("{0} is longer than {1}".format(name2, name1)) 

Formato de cadena con% sy una tupla

 name1 = input("Enter name 1: ") name2 = input("Enter name 2: ") len(name1) len(name2) if len(name1) == len(name2): if name1 == name2: print ("The names are the same") else: print ("The names are different, but are the same length") elif len(name1) > len(name2): print ("%s is longer than %s" % (name1, name2)) elif len(name1) < len(name2): print ("%s is longer than %s" % (name2, name1)) 

Encuentro el error también,

 _mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Pero la lista args funciona bien.

Yo uso mysqlclient python lib. La lib parece que no acepta arglas tupla. Para pasar la lista de argumentos como ['arg1', 'arg2'] funcionará.

django raw sql query in view

 "SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to) 

modelos.py

 class VehicleDamage(models.Model): requestdate = models.DateTimeField("requestdate") vendor_name = models.CharField("vendor_name", max_length=50) class Meta: managed=False 

vistas.py

 def location_damageReports(request): #static date for testing date_from = '2019-11-01' date_to = '2019-21-01' vehicle_damage_reports = VehicleDamage.objects.raw("SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to)) damage_report = DashboardDamageReportSerializer(vehicle_damage_reports, many=True) data={"data": damage_report.data} return HttpResponse(json.dumps(data), content_type="application/json") 

Nota: usando python 3.5 y django 1.11