Python TypeError: không đủ đối số cho chuỗi định dạng


137

Đây là đầu ra. Đây là những chuỗi utf-8 tôi tin rằng ... một số trong số này có thể là Không loại nhưng nó thất bại ngay lập tức, trước những chuỗi như thế ...

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

TypeError: không đủ đối số cho chuỗi định dạng

7 của nó mặc dù 7?

Câu trả lời:


177

Lưu ý rằng %cú pháp định dạng chuỗi đang trở nên lỗi thời. Nếu phiên bản Python của bạn hỗ trợ nó, bạn nên viết:

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

Điều này cũng sửa lỗi mà bạn đã xảy ra.


Điều này có làm việc cho các mô-đun đăng nhập là tốt? Là loại nội suy được hiểu bởi nó?
AllTradesJack

@joshsvoss: vâng, có một vài liên kết được đề cập ở đây thảo luận về các khả năng: bug.python.org/su14031
Simeon Visser

4
@SimeonVisser, tại sao điều này trở nên lỗi thời? Ví dụ: nếu bạn sử dụng một biến để lưu trữ chuỗi định dạng và bạn muốn đặt chuỗi với các giá trị được thay thế trong cùng một biến, bạn chỉ nhận được một mã sạch hơn một chút với format_ chuỗi% = ('bla', 'bla', 'bla') . Quan tâm đến việc xây dựng hoặc chỉ ra một số liên kết hữu ích về điều này?
Djuka

.format () đã được thêm vào vì điều này khá phổ biến và không nên yêu cầu người vận hành thực hiện. Ví dụ của bạn là tốt đẹp nhưng khó để giải thích cho người mới. Ký hiệu a = a.format (1,2,3) rõ ràng hơn và dễ hiểu / dễ dạy hơn. Tôi không có liên kết nhưng đây là lý do chính tại sao định dạng () được giới thiệu (dễ hiểu).
Simeon Visser

1
Ngoài ra, định dạng () hỗ trợ các cách rõ ràng hơn để diễn đạt những gì xảy ra, chẳng hạn như "{a} {b}". Format (a = '3', b = '4').
Simeon Visser

240

Bạn cần đặt các đối số định dạng vào một tuple (thêm dấu ngoặc đơn):

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

Những gì bạn hiện có tương đương với những điều sau đây:

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

Thí dụ:

>>> "%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
Điều đó đã làm việc..sort của. Tôi đã cố gắng sử dụng định dạng% s để tránh lỗi noneType, nhưng tôi vẫn nhận được. Liên quan: stackoverflow.com/questions/1338690/
Mạnh

Sẽ không hữu ích với OP, với độ tuổi, nhưng trong trường hợp vẫn hữu ích với ai đó: một cách giải quyết đơn giản trong đó một biến có thể là không có gì để bảo vệ chống lại điều đó bằng một câu lệnh tạm thời - tức là "% s% s"% ( a nếu a không phải là Không có ai khác "", b) nếu chúng ta lo lắng về việc có thể là Không có. Vì vậy, ngay cả khi a là Không, chúng tôi vẫn không chuyển Không cho toán tử định dạng và gây ra sự cố.
Blair

21

Tôi đã gặp lỗi tương tự khi sử dụng %như một ký tự phần trăm trong chuỗi định dạng của mình. Giải pháp cho vấn đề này là tăng gấp đôi %%.


4
Cung cấp một số ví dụ mã về cách giải pháp của bạn hoạt động và cách nó không thành công, v.v. có thể hữu ích. Xem Làm thế nào để tôi viết một câu trả lời tốt? . Lưu ý rằng đây là câu hỏi 5 năm tuổi, vì vậy bạn chỉ nên thêm câu trả lời nếu nó cung cấp nhiều thông tin hơn những câu hỏi đã có.
Ramon

Tôi có một biến thể của lỗi này do lỗi đánh máy:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall

Đối với python3, "giải pháp" này là sai -> Cú pháp không hợp lệ
JonyD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.