Python TypeError: недостаточно аргументов для строки формата

138

Вот результат. Я считаю, что это строки utf-8 ... некоторые из них могут быть NoneType, но они сразу же выходят из строя, прежде чем такие ...

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

Ошибка типа: недостаточно аргументов для строки формата

Его 7 из 7?

2000 год
источник

Ответы:

177

Обратите внимание, что %синтаксис для форматирования строк устаревает. Если ваша версия Python поддерживает это, вы должны написать:

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

Это также исправляет ошибку, которая у вас возникла.

Симеон Виссер
источник
Это работает и для модуля регистрации? Понимается ли под этим такая интерполяция?
AllTradesJack
@joshsvoss: да, здесь упоминается несколько ссылок, в которых обсуждаются возможности: bugs.python.org/issue14031
Симеон Виссер
4
@SimeonVisser, почему это устаревает? Если вы, например, используете одну переменную для хранения строки формата и хотите поместить строку с замененными значениями в одну и ту же переменную, вы получите лишь немного более чистый код с format_string% = ('bla', 'bla', 'bla') , Хотите уточнить или указать на какую-нибудь полезную ссылку по этому поводу?
Djuka
.format () был добавлен, потому что это довольно распространено и для этого не требуется оператор. Ваш пример хорош, но трудно объяснить новичку. Обозначение a = a.format (1,2,3) намного более явное и более легкое для понимания / обучения. У меня нет ссылки, но это основная причина, по которой был введен format () (простота понимания).
Симеон Виссер
1
Кроме того, format () поддерживает более явные способы выражения того, что происходит, например, «{a} {b}». Format (a = '3', b = '4').
Симеон Виссер
240

Вам нужно поместить аргументы формата в кортеж (добавить круглые скобки):

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

То, что у вас сейчас есть, эквивалентно следующему:

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

Пример:

>>> "%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
Это сработало ... вроде как. Я пытался использовать форматирование% s, чтобы избежать ошибки NoneType, но все равно получаю ее. Связанный: stackoverflow.com/questions/1338690/…
y2k
Не будет полезен для OP, учитывая возраст, но на всякий случай все еще полезен для кого-то: простой обходной путь, когда переменная может быть нулевой, заключается в защите от этого с помощью тернарного оператора, например "% s% s"% ( a, если a не является «None else», b) если мы беспокоимся о возможном существовании None. Таким образом, даже если a равно None, мы по-прежнему не передаем None оператору формата и не вызываем проблем.
Блэр
21

Я получил ту же ошибку при использовании %символа процента в моей строке формата. Чтобы решить эту проблему, нужно увеличить вдвое %%.

Брюс Джейквей
источник
4
Может быть полезно предоставить несколько примеров кода, показывающих, как работает ваше решение, и как оно не работает без него и т. Д. Смотрите, как мне написать хороший ответ? , Обратите внимание, что это вопрос 5-летней давности, поэтому вам следует добавлять ответ, только если он предоставляет значительно больше информации, чем уже существующие.
Ramon
У меня есть вариант этой ошибки из-за опечатки:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall
Для python3 это «решение» неверно -> Неверный синтаксис
JonyD