Python TypeError: อาร์กิวเมนต์ไม่เพียงพอสำหรับสตริงรูปแบบ


139

นี่คือผลลัพธ์ นี่คือสตริง utf-8 ที่ฉันเชื่อ ... บางส่วนอาจเป็น NoneType แต่ล้มเหลวทันทีก่อนที่จะเป็นเช่นนั้น ...

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

TypeError: อาร์กิวเมนต์ไม่เพียงพอสำหรับสตริงรูปแบบ

มันเป็น 7 สำหรับ 7?

คำตอบ:


180

โปรดทราบว่า%ไวยากรณ์สำหรับการจัดรูปแบบสตริงเริ่มล้าสมัย หาก Python เวอร์ชันของคุณรองรับคุณควรเขียน:

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

นอกจากนี้ยังแก้ไขข้อผิดพลาดที่เกิดขึ้น


สิ่งนี้ใช้ได้กับโมดูลการบันทึกด้วยหรือไม่ การแก้ไขแบบนี้เข้าใจหรือไม่
AllTradesJack

@joshsvoss: ใช่มีลิงค์บางส่วนที่กล่าวถึงที่นี่ซึ่งพูดถึงความเป็นไปได้: bugs.python.org/issue14031
Simeon Visser

4
@SimeonVisser ทำไมสิ่งนี้ถึงล้าสมัย? ตัวอย่างเช่นหากคุณใช้ตัวแปรเดียวเพื่อจัดเก็บสตริงรูปแบบและคุณต้องการใส่สตริงที่มีค่าที่ถูกแทนที่ในตัวแปรเดียวกันคุณจะได้รับโค้ดทำความสะอาดบิตเพียงเล็กน้อยที่มีformat_string% = ('bla', 'bla', 'bla') . สนใจที่จะอธิบายรายละเอียดหรือชี้ไปที่ลิงค์ที่เป็นประโยชน์เกี่ยวกับเรื่องนี้หรือไม่?
Djuka

.format () ถูกเพิ่มเข้ามาเนื่องจากเป็นเรื่องปกติและไม่ควรต้องใช้โอเปอเรเตอร์ในการทำ ตัวอย่างของคุณดี แต่อธิบายให้ผู้มาใหม่เข้าใจได้ยาก สัญกรณ์ a = a.format (1,2,3) มีความชัดเจนและง่ายต่อการเข้าใจ / สอนมากขึ้น ฉันไม่มีลิงค์ แต่นี่คือสาเหตุหลักที่ทำให้มีการแนะนำรูปแบบ () (ความเข้าใจง่าย)
Simeon Visser

1
นอกจากนี้ format () ยังรองรับวิธีการที่ชัดเจนมากขึ้นในการแสดงสิ่งที่เกิดขึ้นเช่น "{a} {b}". format (a = '3', b = '4')
Simeon Visser

244

คุณต้องใส่อาร์กิวเมนต์รูปแบบลงในทูเปิล (เพิ่มวงเล็บ):

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
ได้ผล.. เรียงจาก. ฉันพยายามใช้การจัดรูปแบบ% s เพื่อหลีกเลี่ยงข้อผิดพลาด NoneType แต่ฉันก็ยังทำได้ ที่เกี่ยวข้อง: stackoverflow.com/questions/1338690/…
y2k

จะไม่มีประโยชน์กับ OP ตามอายุ แต่ในกรณีที่ยังมีประโยชน์กับใครบางคน: วิธีแก้ปัญหาง่ายๆที่ตัวแปรอาจไม่มีเลยคือการป้องกันด้วยคำสั่งท้าย - เช่น "% s% s"% ( a if a is not None else "", b) ถ้าเรากังวลว่าอาจจะไม่มี ดังนั้นแม้ว่า a is None เราก็ยังไม่ส่ง None ไปยังตัวดำเนินการรูปแบบและทำให้เกิดปัญหา
แบลร์

22

ฉันได้รับข้อผิดพลาดเดียวกันเมื่อใช้%เป็นอักขระเปอร์เซ็นต์ในสตริงรูปแบบของฉัน วิธีแก้ปัญหานี้คือการเพิ่มไฟล์%%.


4
การให้ตัวอย่างโค้ดเกี่ยวกับวิธีการทำงานของโซลูชันของคุณและวิธีที่ล้มเหลวหากไม่มีโค้ดเหล่านี้ ฯลฯ อาจเป็นประโยชน์ ดูฉันจะเขียนคำตอบที่ดีได้อย่างไร? . โปรดทราบว่านี่เป็นคำถามอายุ 5 ปีดังนั้นคุณควรเพิ่มคำตอบก็ต่อเมื่อคำถามนั้นให้ข้อมูลมากกว่าคำถามที่มีอยู่แล้วเท่านั้น
Ramon

ฉันได้รับข้อผิดพลาดนี้รูปแบบหนึ่งเนื่องจากการพิมพ์ผิด:"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.