TypeError: Niet alle argumenten geconverteerd tijdens het opmaken van Python

Het programma moet in twee namen innemen en als ze dezelfde lengte hebben, moet het controleren of ze hetzelfde woord zijn. Als het hetzelfde woord is, print het “de namen zijn hetzelfde” . Als ze dezelfde lengte hebben, maar met verschillende letters print het “de namen zijn anders, maar dezelfde lengte” . Het deel waar ik een probleem mee heb, bevindt zich in de onderste 4 regels.

#!/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)

Wanneer ik deze code uitvoer, wordt het weergegeven:

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

Alle suggesties worden zeer op prijs gesteld.


Antwoord 1, Autoriteit 100%

U mengt verschillende formaatfuncties.

De oude stijl %formatteren gebruikt %codes voor opmaak:

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

De nieuwe stijl {}opmaak gebruikt {}codes en de .formatmethode

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

Houd er rekening mee dat u bij opmaak in oude stijl meerdere argumenten moet specificeren met een tuple:

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

In jouw geval, aangezien je {}formaatspecificaties gebruikt, gebruik je .format:

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

Antwoord 2, autoriteit 23%

De fout zit in je tekenreeksopmaak.

De juiste manier om traditionele tekenreeksopmaak te gebruiken met de operator ‘%’, is door een tekenreeks in printf-stijl te gebruiken (Python-documentatie hiervoor vindt u hier: http://docs.python.org/2/library/string.html#format-string-syntax):

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

De operator ‘%’ zal in de toekomst waarschijnlijk worden afgeschaft. De nieuwe PEP 3101manier om dingen te doen is als volgt:

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

Antwoord 3, autoriteit 20%

Voor mij werd deze fout veroorzaakt toen ik probeerde een tuple door te geven aan de tekenreeksopmaakmethode.

Ik heb de oplossing gevonden met deze vraag/antwoord

Het juiste antwoord uit de link kopiëren en plakken (NIET MIJN WERK):

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

Een singleton tuple maken met de tuple van belang als het enige item,
d.w.z. het (thetuple,) deel, is hier het sleutelwoord.


Antwoord 4, autoriteit 6%

In mijn geval is dat omdat ik maar een enkele %snodig heb, omdat ik waarden heb ingevoerd.


Antwoord 5, autoriteit 2%

Naast de andere twee antwoorden, denk ik dat de inspringingen ook onjuist zijn in de laatste twee voorwaarden.
De voorwaarden zijn dat de ene naam langer is dan de andere en dat ze moeten beginnen met ‘elif’ en zonder inspringingen. Als je het binnen de eerste voorwaarde plaatst (door het vier inspringingen vanaf de marge te geven), wordt het tegenstrijdig omdat de lengtes van de namen niet tegelijkertijd gelijk en verschillend kunnen zijn.

   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))

Antwoord 6

Er is een combinatie van problemen, zoals aangegeven in enkele van de andere antwoorden.

  1. Zoals aangegeven door nneonneo, mix je verschillende String Formatting-methoden.
  2. Zoals opgemerkt door GuyP, is je inspringing ook uitgeschakeld.

Ik heb zowel het voorbeeld van .format als het doorgeven van tuples aan de argumentspecificatie van %s gegeven. In beide gevallen is de inspringing zo vastgesteld dat groter/kleiner dan de controles buiten de lengte vallen. Ook latere if-instructies gewijzigd in elif’s, zodat ze alleen worden uitgevoerd als de eerdere instructie op hetzelfde niveau False was.

String-opmaak met .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))

Stringopmaak met %s en een tuple

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))

Antwoord 7

In python 3.7 en hoger is er een nieuwe en gemakkelijke manier. hier is de syntaxis:

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

Uitvoer:

Hello, Eric. You are 74.

Antwoord 8

Houd er rekening mee dat deze fout ook kan worden veroorzaakt door te vergeten naar de variabele te verwijzen

"this is a comment" % comment #ERROR

in plaats van

"this is a comment: %s" % comment

Antwoord 9

Voor mij, aangezien ik veel waarden opsloeg binnen een enkele afdrukaanroep, was de oplossing om een afzonderlijke variabele te maken om de gegevens als een tuple op te slaan en vervolgens de afdrukfunctie aan te roepen.

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

Antwoord 10

Meest gemakkelijke manier om tekenreeksnummer naar geheel getal te typen

number=89
number=int(89)

Antwoord 11

Ik kom de fout ook tegen,

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Maar lijstargumenten werken goed.

Ik gebruik mysqlclient python lib. De lib lijkt geen tuple-args te accepteren. Om lijstargumenten zoals ['arg1', 'arg2']door te geven, zal het werken.


Antwoord 12

django raw sql-query in beeld

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

modellen.py

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

views.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")

Opmerking: python 3.5 en django 1.11 gebruiken

Other episodes