web-dev-qa-db-fra.com

TypeError: pas tous les arguments convertis lors du formatage de chaîne python

Le programme est supposé prendre deux noms et, s'ils ont la même longueur, il convient de vérifier s'ils sont identiques. Si c'est le même mot, il sera imprimé "Les noms sont les mêmes" . Si elles ont la même longueur mais avec des lettres différentes, le résultat sera imprimé "Les noms sont différents mais de même longueur" . La partie avec laquelle j'ai un problème est dans les 4 dernières lignes.

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

Quand je lance ce code, il affiche:

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

Toutes les suggestions sont très appréciées.

150
user2652300

Vous mélangez différentes fonctions de format.

Le formatage % à l'ancienne utilise les codes % pour le formatage:

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

La mise en forme {} de style nouveau utilise les codes {} et la méthode .format

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

Notez qu'avec la mise en forme à l'ancienne, vous devez spécifier plusieurs arguments à l'aide d'un tuple:

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

Dans votre cas, puisque vous utilisez des spécificateurs de format {}, utilisez .format:

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

L'erreur est dans votre formatage de chaîne.

La manière correcte d'utiliser le formatage de chaîne traditionnel à l'aide de l'opérateur '%' consiste à utiliser une chaîne de format de style printf (la documentation Python à ce sujet est disponible ici: http://docs.python.org/2/library/string.html format-string-syntax ):

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

Cependant, l'opérateur '%' sera probablement obsolète à l'avenir . La nouvelle PEP 3101 est la suivante:

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

Pour moi, cette erreur a été provoquée lorsque je tentais de transmettre un tuple à la méthode de formatage de chaîne.

J'ai trouvé la solution de cette question/réponse

Copier et coller la bonne réponse à partir du lien (NOT MY WORK):

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

Faire un singleton Tuple avec le Tuple d’intérêt comme unique objet, c’est-à-dire la partie (le), est la clé ici.

39
Nick Brady

Dans mon cas, c'est parce que je n'ai besoin que d'un seul %s, les valeurs manquantes étant entrées.

6
ParisNakitaKejser

En plus des deux autres réponses, je pense que les indentations sont également incorrectes dans les deux dernières conditions ... Les conditions sont qu'un nom est plus long que l'autre et qu'il doit commencer par "Elif" et sans indentation. Si vous le placez dans la première condition (en lui donnant quatre indentations dans la marge), cela finit par être contradictoire car les longueurs des noms ne peuvent pas être égales et différentes en même temps. 

    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

Il existe une combinaison de problèmes, comme indiqué dans quelques-unes des autres réponses.

  1. Comme le souligne nneonneo, vous mélangez différentes méthodes de formatage de chaînes.
  2. Comme GuyP l’a souligné, votre retrait est également désactivé.

J'ai fourni à la fois l'exemple de .format et la transmission de nuplets au spécificateur d'argument de% s. Dans les deux cas, l'indentation a été corrigée. Par conséquent, les vérifications sont inférieures ou supérieures à la longueur. Les instructions if suivantes ont également été modifiées pour Elif afin qu'elles ne s'exécutent que si l'instruction précédente de même niveau était False.

Formatage de chaîne avec .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))

Formatage de chaîne avec% s et un 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))
1
Trevor Benson

Django raw sql query in view

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

Note: en utilisant python 3.5 et Django 1.11

0
Vinay Kumar

Je rencontre aussi l'erreur, 

_mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 

Mais la liste des arguments fonctionne bien.

J'utilise mysqlclient python lib. La lib ne semble pas accepter les arguments de Tuple. Passer des arguments de liste comme ['arg1', 'arg2'] fonctionnera.

0
Victor Choy