Python TypeError:格式字符串的参数不足


137

这是输出。我相信这些是utf-8字符串...其中一些可以是NoneType,但是在类似这样的字符串之前会立即失败...

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

TypeError:格式字符串的参数不足

虽然是7比7?

Answers:


177

请注意,%格式化字符串的语法已过时。如果您的Python版本支持它,则应编写:

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

这也可以修复您碰巧遇到的错误。


这对日志记录模块也有效吗?这种插值可以理解吗?
2014年

@joshsvoss:是的,这里提到了一些讨论可能性的链接:bugs.python.org/issue14031
Simeon Visser

4
@SimeonVisser,为什么这已经过时了?例如,如果您使用一个变量存储格式字符串,并且要将替换后的值的字符串放入同一变量中,则只能得到格式格式为%=('bla','bla','bla')的一点点清洁代码。想要详细说明或指向一些有用的链接吗?
2015年

添加了.format(),因为它很常见,不需要操作员执行。您的示例很好,但是很难向新手解释。表示法a = a.format(1,2,3)更明确,更易于理解/教导。我没有链接,但这是引入format()的主要原因(易于理解)。
Simeon Visser 2015年

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
那工作。我试图使用%s格式来避免NoneType错误,但我还是得到了它。相关阅读: stackoverflow.com/questions/1338690/...
2000年

给定年龄,对OP不会有用,但以防万一仍然对某人有用:一个可能不存在变量的简单解决方法是使用三元语句来防止这种情况发生,即“%s%s”%(如果a不是a,则为a;否则,b)如果我们担心可能为None。因此,即使a为None,我们仍然不会将None传递给格式运算符并引起问题。
布莱尔

21

%在格式字符串中用作百分比字符时,出现了相同的错误。解决的办法是加倍%%


4
提供一些代码示例来说明您的解决方案如何工作以及在没有解决方案的情况下如何失败等,可能会很有用。请参阅如何写一个好的答案?。请注意,这是一个已有5年历史的问题,因此,仅当它提供的信息比已存在的信息多得多时,才应添加答案。
拉蒙

由于拼写错误,我得到了此错误的变种: "foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % {"foo": "FOO", "bar": "BAR", "baz": "BAZ"}
Akavall,

对于python3,此“解决方案”是错误的->语法无效
JonyD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.