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

Posted

技术标签:

【中文标题】Python TypeError:格式字符串的参数不足【英文标题】:Python TypeError: not enough arguments for format string 【发布时间】:2012-06-24 03:52:57 【问题描述】:

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

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

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

7 换 7?

【问题讨论】:

【参考方案1】:

您需要将格式参数放入一个元组(添加括号):

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'

【讨论】:

那行得通..有点。我试图使用 %s 格式来避免 NoneType 错误,但我仍然得到它。相关:***.com/questions/1338690/… 考虑到年龄,不会对 OP 有用,但以防万一对某人仍然有用:一个简单的解决方法是使用三元语句来防止变量可能为空 - 即"%s %s" % (a if a is not None else "", b) 如果我们担心 a 可能是 None。所以即使 a 是 None 我们仍然没有将 None 传递给格式运算符并导致问题。【参考方案2】:

请注意,用于格式化字符串的% 语法已经过时。如果你的 Python 版本支持它,你应该写:

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

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

【讨论】:

这也适用于日志模块吗?这种插值被它理解了吗? @joshsvoss:是的,这里提到了一些讨论可能性的链接:bugs.python.org/issue14031 @SimeonVisser,为什么这已经过时了?例如,如果您使用一个变量来存储格式字符串,并且您想将具有替换值的字符串放在同一个变量中,您会得到一个更简洁的代码 format_string %= ('bla', 'bla', '布拉')。想详细说明或指出一些有用的链接吗? 另外,format() 支持更明确的表达方式,例如 "a b".format(a='3', b='4')。跨度> 我用的是python 3.6.5,百分号运算符还是可以用的...【参考方案3】:

在我的格式字符串中使用% 作为百分号字符时,我遇到了同样的错误。解决这个问题的方法是将%% 加倍。

【讨论】:

提供一些代码示例来说明您的解决方案是如何工作的,以及如果没有它,它会如何失败等可能会很有用。见How do I write a good answer?。请注意,这是一个已有 5 年历史的问题,因此只有当它提供的信息比已有的信息多得多时,您才应该添加答案。 由于拼写错误,我得到了这个错误的变体:"foo: %(foo)s, bar: s(bar)% baz: %(baz)s" % "foo": "FOO", "bar": "BAR", "baz": "BAZ" 对于 python3 这个“解决方案”是错误的 -> 无效的语法【参考方案4】:

出于特定原因,我在使用 raw 查询时遇到了同样的问题,这是在 TIME_FORMAT 函数中添加双引号。

User.objects.raw(
            f'SELECT f1,f2,TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(end_time) - TIME_TO_SEC(start_time))),"%%H:%%i") AS log FROM users GROUP BY start_dt')

【讨论】:

以上是关于Python TypeError:格式字符串的参数不足的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:在字符串格式化python期间并非所有参数都转换了

TypeError:在字符串格式化python Flask期间并非所有参数都转换了[重复]

typeError:并非所有参数都在字符串格式化期间进行了转换

python脚本中的TypeError

带有熊猫数据框输入的 sklearn 分类报告产生:“TypeError:并非所有参数都在字符串格式化期间转换”

python 链接数据时报错 TypeError: %d format: a number is required, not str 是因为端口号写成字符串格式的了