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 2014

@joshsvoss:はい、可能性を説明するリンクがここで言及されています:bugs.python.org/issue14031
Simeon Visser 14

4
@SimeonVisser、なぜこれが時代遅れになったのですか?たとえば、1つの変数を使用してフォーマット文字列を格納し、置換された値を含む文字列を同じ変数に格納する場合、format_string%=( 'bla'、 'bla'、 'bla')を使用した少しばかりクリーンなコードが得られます。。これについて詳しく説明したり、役立つリンクを指摘したりしますか?
Djuka

.format()が追加されました。これは非常に一般的であり、オペレーターが行う必要がないためです。あなたの例はいいですが、初心者に説明するのは難しいです。表記a = a.format(1,2,3)ははるかに明示的で、理解/教えるのが簡単です。リンクはありませんが、これがformat()が導入された主な理由です(理解しやすい)。
Simeon Visser

1
また、format()は、「{a} {b}」。format(a = '3'、b = '4')など、発生することをより明確に表現する方法をサポートします。
Simeon Visser 2015年

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
それはうまくいった。Nonesエラーを回避するために%s形式を使用しようとしましたが、まだ取得中です。関連: stackoverflow.com/questions/1338690/...
Y2K

年齢を考えると、OPには役に立たないでしょうが、万が一誰かに役立つ場合に備えて:変数が存在しない可能性がある簡単な回避策は、3項ステートメントを使用してそれを防ぐことです。つまり、「%s%s」%( aがNoneでない場合 ""、b)Noneである可能性が心配な場合。したがって、aがNoneであっても、フォーマット演算子にNoneを渡していないため、問題が発生していません。
ブレア

21

%書式文字列でパーセント文字として使用すると、同じエラーが発生しました。これに対する解決策は、を2倍にすること%%です。


4
ソリューションがどのように機能するか、それがないとどのように失敗するかなどのいくつかのコード例を提供すると便利です。良い答えを書くにはどうしたらいいですか?をご覧ください。これは5年前の質問なので、すでにそこにあるものよりもかなり多くの情報を提供する場合にのみ回答を追加する必要があることに注意してください。
ラモン

私が原因タイプミスにこのエラーのバリエーションを得た:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall

python3の場合、この「解決策」は間違っています->無効な構文
JonyD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.