Python TypeError: pas assez d'arguments pour la chaîne de format


138

Voici la sortie. Ce sont des chaînes utf-8 je crois ... certaines d'entre elles peuvent être NoneType mais elles échouent immédiatement, avant celles comme ça ...

instr = "'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % softname, procversion, int(percent), exe, description, company, procurl

TypeError: pas assez d'arguments pour la chaîne de format

Son 7 pour 7 cependant?

Réponses:


177

Notez que la %syntaxe de mise en forme des chaînes devient obsolète. Si votre version de Python le prend en charge, vous devez écrire:

instr = "'{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}'".format(softname, procversion, int(percent), exe, description, company, procurl)

Cela corrige également l'erreur que vous aviez.


Cela fonctionne-t-il également pour le module de journalisation? Ce genre d'interpolation est-il compris par lui?
AllTradesJack

@joshsvoss: oui, il y a quelques liens mentionnés ici qui discutent des possibilités: bugs.python.org/issue14031
Simeon Visser

4
@SimeonVisser, pourquoi est-ce que cela devient obsolète? Si, par exemple, vous utilisez une variable pour stocker la chaîne de format et que vous souhaitez mettre une chaîne avec des valeurs remplacées dans la même variable, vous obtenez juste un code un peu plus propre avec format_string% = ('bla', 'bla', 'bla') . Voulez-vous élaborer ou indiquer un lien utile à ce sujet?
Djuka

.format () a été ajouté car c'est assez courant et cela ne devrait pas nécessiter d'opérateur. Votre exemple est agréable mais difficile à expliquer à un nouveau venu. La notation a = a.format (1,2,3) est beaucoup plus explicite et plus facile à comprendre / enseigner. Je n'ai pas de lien mais c'est la principale raison pour laquelle format () a été introduit (facilité de compréhension).
Simeon Visser

1
De plus, format () prend en charge des manières plus explicites d'exprimer ce qui se passe, comme "{a} {b}". Format (a = '3', b = '4').
Simeon Visser

240

Vous devez mettre les arguments de format dans un tuple (ajoutez des parenthèses):

instr = "'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % (softname, procversion, int(percent), exe, description, company, procurl)

Ce que vous avez actuellement équivaut à ce qui suit:

intstr = ("'%s', '%s', '%d', '%s', '%s', '%s', '%s'" % softname), procversion, int(percent), exe, description, company, procurl

Exemple:

>>> "%s %s" % 'hello', 'world'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: not enough arguments for format string
>>> "%s %s" % ('hello', 'world')
'hello world'

3
Cela a fonctionné ... une partie de. J'essayais d'utiliser le formatage% s pour éviter l'erreur NoneType, mais je l'obtiens toujours. En relation: stackoverflow.com/questions/1338690/…
y2k

Ne sera pas utile pour l'OP, étant donné l'âge, mais juste au cas où encore utile à quelqu'un: une solution simple où une variable peut être aucune est de se prémunir contre cela avec une instruction ternaire - c'est-à-dire "% s% s"% ( a si a n'est pas None else "", b) si nous nous inquiétons du fait que a peut-être aucun. Ainsi, même si a vaut None, nous ne transmettons toujours pas None à l'opérateur de format et causons des problèmes.
Blair

21

J'ai eu la même erreur lors de l'utilisation en %tant que caractère de pourcentage dans ma chaîne de format. La solution à cela est de doubler le %%.


4
Fournir des exemples de code du fonctionnement de votre solution et de son échec sans elle, etc. peut être utile. Voir Comment rédiger une bonne réponse? . Notez qu'il s'agit d'une question vieille de 5 ans, vous ne devez donc ajouter une réponse que si elle fournit beaucoup plus d'informations que celles déjà présentes.
Ramon

J'ai eu une variation de cette erreur en raison d'une faute de frappe:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall

Pour python3 cette "solution" est incorrecte -> Syntaxe invalide
JonyD
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.