Python TypeError: argumen tidak cukup untuk format string

138

Inilah hasilnya. Ini adalah utf-8 string yang saya percaya ... beberapa di antaranya bisa berupa NoneType tetapi gagal dengan segera, sebelum yang seperti itu ...

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

TypeError: argumen tidak cukup untuk format string

7 untuk 7?

y2k
sumber

Jawaban:

177

Perhatikan bahwa %sintaks untuk memformat string menjadi usang. Jika versi Python Anda mendukungnya, Anda harus menulis:

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

Ini juga memperbaiki kesalahan yang kebetulan Anda miliki.

Simeon Visser
sumber
Apakah ini juga berfungsi untuk modul logging? Apakah interpolasi semacam ini dimengerti olehnya?
AllTradesJack
@joshsvoss: ya, ada beberapa tautan yang disebutkan di sini yang membahas kemungkinan: bugs.python.org/issue14031
Simeon Visser
4
@SimeonVisser, mengapa ini menjadi ketinggalan zaman? Jika Anda, misalnya, menggunakan satu variabel untuk menyimpan string format dan Anda ingin meletakkan string dengan nilai yang diganti dalam variabel yang sama Anda hanya mendapatkan sedikit kode pembersih sedikit dengan format_string% = ('bla', 'bla', 'bla') . Ingin menguraikan atau menunjuk ke beberapa tautan bermanfaat tentang ini?
Djuka
.format () ditambahkan karena ini sangat umum dan seharusnya tidak memerlukan operator untuk melakukannya. Teladan Anda baik tetapi sulit untuk dijelaskan kepada pendatang baru. Notasi a = a.format (1,2,3) jauh lebih eksplisit dan lebih mudah dipahami / diajarkan. Saya tidak memiliki tautan tetapi ini adalah alasan utama mengapa format () diperkenalkan (kemudahan memahami).
Simeon Visser
1
Juga, format () mendukung cara yang lebih eksplisit untuk mengekspresikan apa yang terjadi, seperti format "{a} {b}" (a = '3', b = '4').
Simeon Visser
240

Anda perlu memasukkan argumen format ke dalam tuple (tambahkan tanda kurung):

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

Apa yang Anda miliki saat ini setara dengan yang berikut:

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

Contoh:

>>> "%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
sumber
3
Itu berhasil..semacam. Saya mencoba menggunakan pemformatan% s untuk menghindari kesalahan NoneType, tapi saya masih mengerti. Terkait: stackoverflow.com/questions/1338690/…
y2k
Tidak akan berguna bagi OP, mengingat usia, tetapi untuk berjaga-jaga masih berguna bagi seseorang: solusi sederhana di mana variabel mungkin tidak ada adalah untuk menjaga terhadap itu dengan pernyataan ternary - yaitu "% s% s"% ( a jika a bukan yang lain "", b) jika kita khawatir tentang kemungkinan yang tidak ada. Jadi, bahkan jika a adalah TIDAK, kita masih tidak mengirimkan Tidak ke operator format dan menyebabkan masalah.
Blair
21

Saya mendapatkan kesalahan yang sama ketika menggunakan %sebagai karakter persen dalam string format saya. Solusi untuk ini adalah dengan menggandakan %%.

Bruce Jakeway
sumber
4
Memberikan beberapa contoh kode tentang bagaimana solusi Anda bekerja, dan bagaimana itu gagal tanpanya, dll. Mungkin berguna. Lihat Bagaimana cara menulis jawaban yang baik? . Perhatikan bahwa ini adalah pertanyaan berusia 5 tahun, jadi Anda harus menambahkan jawaban hanya jika itu memberikan informasi yang jauh lebih banyak daripada yang sudah ada.
Ramon
Saya mendapat variasi kesalahan ini karena kesalahan ketik:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall
Untuk python3 "solusi" ini salah -> Sintaks tidak valid
JonyD