it-swarm.com.de

TypeError: Nicht alle Argumente, die während der Python-Formatierung von Zeichenfolgen konvertiert wurden

Das Programm soll zwei Namen annehmen, und wenn sie die gleiche Länge haben, sollte geprüft werden, ob sie dasselbe Wort sind. Wenn es das gleiche Wort ist, wird es gedruckt "Die Namen sind gleich" . Wenn sie die gleiche Länge haben, aber mit unterschiedlichen Buchstaben, wird gedruckt "Die Namen sind unterschiedlich, aber gleich lang" . Der Teil, mit dem ich ein Problem habe, ist in den unteren 4 Zeilen.

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

Wenn ich diesen Code ausführe, wird Folgendes angezeigt:

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

Anregungen werden sehr geschätzt.

150
user2652300

Sie mischen verschiedene Formatfunktionen.

Die %-Formatierung im alten Stil verwendet %-Codes für die Formatierung:

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

Die neue Formatierung von {} verwendet {}-Codes und die .format-Methode

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

Beachten Sie, dass Sie bei der Formatierung im alten Stil mehrere Argumente mit einem Tuple angeben müssen:

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

In Ihrem Fall verwenden Sie {}, da Sie .format-Formatbezeichner verwenden.

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

Der Fehler liegt in Ihrer String-Formatierung.

Die korrekte Methode zur Verwendung der traditionellen Zeichenfolgenformatierung mit dem Operator '%' ist die Verwendung einer Formatzeichenfolge im Format Printf (Python-Dokumentation hier: http://docs.python.org/2/library/string.html# Format-String-Syntax ):

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

Der '%'-Operator wird jedoch in Zukunft wahrscheinlich nicht mehr empfohlen . Die neue Vorgehensweise - PEP 3101 - sieht folgendermaßen aus:

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

Dieser Fehler wurde für mich verursacht, als ich versuchte, ein Tuple in die String-Format-Methode zu übergeben.

Ich habe die Lösung aus dieser Frage/Antwort gefunden

Kopieren und Einfügen der richtigen Antwort aus dem Link (NICHT MEINE ARBEIT):

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

Erstellen eines Singleton-Tuples mit dem Tupel von Interesse als einzigem Element, d.h. der (dasTuple) -Teil ist hier das Schlüsselbit.

39
Nick Brady

In meinem Fall ist es, weil ich nur einen einzigen %s benötige, die Werteingabe fehlt.

6

Neben den beiden anderen Antworten finde ich, dass die Einrückungen auch in den letzten beiden Bedingungen falsch sind. Die Bedingungen lauten, dass ein Name länger ist als der andere und sie müssen mit 'Elif' und ohne Einrückungen beginnen. Wenn Sie es in die erste Bedingung stellen (indem Sie vier Einrückungen vom Rand her geben), ist es widersprüchlich, weil die Länge der Namen nicht gleichzeitig und unterschiedlich sein kann. 

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

In einigen anderen Antworten wird auf eine Kombination von Themen hingewiesen.

  1. Wie von nneonneo ausgeführt, mischen Sie verschiedene String-Formatierungsmethoden.
  2. Wie von GuyP ausgeführt, ist Ihre Einrückung ebenfalls deaktiviert.

Ich habe sowohl das Beispiel als .format zur Verfügung gestellt als auch Tupel an den Argumentspezifizierer von% s übergeben. In beiden Fällen wurde die Einrückung so festgelegt, dass die Überprüfungen außerhalb oder außerhalb der angegebenen Länge liegen. Nachfolgende if-Anweisungen in Elifs wurden geändert, sodass sie nur ausgeführt werden, wenn die vorherige Anweisung auf der gleichen Ebene False war.

String-Formatierung mit .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))

String-Formatierung mit% s und einem Tupel

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))
1
Trevor Benson

Django Raw SQL Abfrage in Ansicht

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

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

Hinweis: Verwenden Sie Python 3.5 und Django 1.11

0
Vinay Kumar

Ich stoße auch auf den Fehler, 

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Listenlisten funktionieren jedoch gut.

Ich benutze mysqlclient python lib. Die lib sieht so aus, als würden sie keine Tuple args akzeptieren. Listenlisten wie ['arg1', 'arg2'] zu übergeben, funktioniert.

0
Victor Choy