Python TypeError: argumentos insuficientes para a string de formato

138

Aqui está a saída. Essas são utf-8 strings que eu acredito ... algumas delas podem ser NoneType, mas falham imediatamente, antes de outras assim ...

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

TypeError: argumentos insuficientes para a sequência de formato

Seus 7 por 7 embora?

y2k
fonte

Respostas:

177

Observe que a %sintaxe para formatar seqüências de caracteres está desatualizada. Se sua versão do Python suportar, você deve escrever:

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

Isso também corrige o erro que ocorreu.

Simeon Visser
fonte
Isso funciona para o módulo de registro também? Esse tipo de interpolação é entendido por ele?
AllTradesJack
@joshsvoss: sim, existem algumas ligações mencionado aqui que discutir as possibilidades: bugs.python.org/issue14031
Simeon Visser
4
@SimeonVisser, por que isso está se tornando ultrapassado? Se você, por exemplo, usa uma variável para armazenar a string de formato e deseja colocar a string com valores substituídos na mesma variável, obtém apenas um código mais limpo com format_string% = ('bla', 'bla', 'bla') . Gostaria de elaborar ou apontar para algum link útil sobre isso?
Djuka
.format () foi adicionado porque isso é bastante comum e não deve exigir de um operador. Seu exemplo é bom, mas difícil de explicar para um recém-chegado. A notação a = a.format (1,2,3) é muito mais explícita e mais fácil de entender / ensinar. Não tenho um link, mas esse é o principal motivo pelo qual o format () foi introduzido (facilidade de entendimento).
Simeon Visser
1
Além disso, format () suporta maneiras mais explícitas de expressar o que acontece, como "{a} {b}". Format (a = '3', b = '4').
Simeon Visser
240

Você precisa colocar os argumentos de formato em uma tupla (adicione parênteses):

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

O que você possui atualmente é equivalente ao seguinte:

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

Exemplo:

>>> "%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'
Andrew Clark
fonte
3
Isso funcionou ... mais ou menos. Eu estava tentando usar a formatação% s para evitar o erro NoneType, mas ainda estou conseguindo. Veja também: stackoverflow.com/questions/1338690/…
y2k
Não será útil para o OP, dada a idade, mas apenas para o caso de alguém: uma solução alternativa simples em que uma variável pode ser nenhuma é se proteger contra isso com uma declaração ternária - por exemplo, "% s% s"% ( a se a não for Nenhum mais "", b) se estivermos preocupados com um possível ser Nenhum. Portanto, mesmo que a seja None, ainda não estamos passando None para o operador de formato e causando problemas.
Blair
21

Eu recebi o mesmo erro ao usar %como caractere de porcentagem na minha string de formato. A solução para isso é dobrar o %%.

Bruce Jakeway
fonte
4
Fornecer alguns exemplos de código de como sua solução funciona e como ela falha sem ela, etc. pode ser útil. Consulte Como escrevo uma boa resposta? . Observe que essa é uma pergunta de 5 anos; portanto, você deve adicionar uma resposta apenas se ela fornecer significativamente mais informações do que as que já existem.
Ramon
Eu tenho uma variação deste erro devido a erro de digitação:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall
Para python3, esta "solução" está errada -> Sintaxe inválida
JonyD 17/06/19