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?

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.


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'

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 %%.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.