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


138

Ось вихід. Я вважаю, що це рядки utf-8 ... деякі з них можуть бути NoneType, але вони виходять з ладу негайно, перед такими як ...

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

TypeError: недостатньо аргументів для рядка формату

Його 7 на 7, хоча?

Відповіді:


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
Simeon Visser

4
@SimeonVisser, чому це застаріло? Якщо ви, наприклад, використовуєте одну змінну для зберігання рядка формату, і ви хочете вставити рядок із заміненими значеннями в ту саму змінну, ви отримаєте просто чистіший код чистішого біта з format_string% = ('bla', 'bla', 'bla') . Хочете розробити або вказати на якесь корисне посилання з цього приводу?
Джука

.format () був доданий, оскільки це досить часто, і він не повинен вимагати від оператора. Ваш приклад добре, але важко пояснити новоприбулому. Позначення a = a.format (1,2,3) набагато чіткіше і простіше зрозуміти / навчити. У мене немає посилання, але це головна причина, чому було введено format () (простота розуміння).
Симеон Віссер

1
Також формат () підтримує більш чіткі способи вираження того, що відбувається, наприклад, формат "{a} {b}". (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

Не буде корисним для ОП, враховуючи вік, але на всякий випадок все-таки комусь корисний: простий спосіб вирішення, де змінною може бути жодна, - це захист від цього з потрійним твердженням - тобто "% s% s"% ( a якщо a - ніхто інше "", b) якщо ми переживаємо за те, що, можливо, немає ". Тож навіть якщо a є None, ми все одно не передаємо None оператору формату і створюємо проблеми.
Блер

21

Я отримав таку ж помилку при використанні %як відсотковий символ у моєму рядку формату. Рішенням цього є подвоєння %%.


4
Надання декількох прикладів коду того, як працює ваше рішення, і як воно не справляється без нього тощо, може бути корисним. Див. Як написати гарну відповідь? . Зауважте, що це запитання для 5 років, тому відповідь слід додавати лише у тому випадку, якщо вона містить значно більше інформації, ніж ті, які вже є.
Рамон

Я отримав варіацію цієї помилки через помилку "foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
друку

Для python3 це "рішення" неправильне -> Неправильний синтаксис
JonyD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.