Python TypeError: za mało argumentów dla ciągu formatu

139

Oto wynik. Są to ciągi utf-8, jak sądzę ... niektóre z nich mogą być typu NoneType, ale natychmiast zawodzą, przed takimi jak to ...

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

TypeError: za mało argumentów dla ciągu formatu

Jednak jego 7 za 7?

y2k
źródło

Odpowiedzi:

180

Zwróć uwagę, że %składnia formatowania ciągów staje się nieaktualna. Jeśli Twoja wersja Pythona to obsługuje, powinieneś napisać:

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

To również naprawia błąd, który miałeś.

Simeon Visser
źródło
Czy to działa również w przypadku modułu logowania? Czy ten rodzaj interpolacji jest przez nią rozumiany?
AllTradesJack
@joshsvoss: tak, jest kilka odnośników wspomnianych tutaj, które omawiają możliwości: bugs.python.org/issue14031
Simeon Visser
4
@SimeonVisser, dlaczego to staje się nieaktualne? Jeśli na przykład używasz jednej zmiennej do przechowywania ciągu formatu i chcesz umieścić ciąg z zastąpionymi wartościami w tej samej zmiennej, otrzymasz tylko odrobinę czystszy kod z format_string% = ('bla', 'bla', 'bla') . Chcesz to rozwinąć lub wskazać jakieś przydatne łącze na ten temat?
Djuka
.format () został dodany, ponieważ jest to dość powszechne i nie powinno wymagać tego operatora. Twój przykład jest ładny, ale trudny do wyjaśnienia nowicjuszowi. Notacja a = a.format (1, 2, 3) jest dużo bardziej wyraźna i łatwiejsza do zrozumienia / nauczenia. Nie mam linku, ale to jest główny powód, dla którego wprowadzono format () (łatwość zrozumienia).
Simeon Visser
1
Ponadto format () obsługuje bardziej wyraźne sposoby wyrażania tego, co się dzieje, takie jak „{a} {b}”. Format (a = '3', b = '4').
Simeon Visser
244

Musisz umieścić argumenty formatu w krotce (dodaj nawiasy):

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

To, co obecnie masz, jest równoważne z:

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

Przykład:

>>> "%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
źródło
3
To zadziałało… trochę. Próbowałem użyć formatowania% s, aby uniknąć błędu NoneType, ale nadal go otrzymuję. Związane z: stackoverflow.com/questions/1338690/ ...
y2k,
Nie będzie przydatny dla OP, biorąc pod uwagę wiek, ale na wszelki wypadek nadal przydatny dla kogoś: prostym obejściem, w którym zmienna może być żadna, jest ochrona przed tym za pomocą potrójnego oświadczenia - tj. "% S% s"% ( a jeśli a nie jest Nikim innym "", b) jeśli martwimy się o ewentualną bycie Żaden. Więc nawet jeśli a jest None, nadal nie przekazujemy None do operatora formatu i nie powodujemy problemów.
Blair
22

Ten sam błąd wystąpił podczas używania %znaku procentu w ciągu formatu. Rozwiązaniem tego problemu jest podwojenie %%.

Bruce Jakeway
źródło
4
Podanie przykładów kodu pokazujących, jak działa Twoje rozwiązanie i jak zawodzi bez niego itp. Może być przydatne. Zobacz: Jak napisać dobrą odpowiedź? . Zauważ, że jest to pytanie sprzed 5 lat, więc powinieneś dodać odpowiedź tylko wtedy, gdy zawiera ona znacznie więcej informacji niż te, które już tam są.
Ramon
Otrzymałem odmianę tego błędu z powodu literówki:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall
Dla pythona3 to "rozwiązanie" jest błędne -> Nieprawidłowa składnia
JonyD