Python 类型错误:非空格式字符串传递给 object.__format__

78 投票
2 回答
65939 浏览
提问于 2025-04-18 09:28

我最近遇到了一个TypeError的错误,这个错误让我很难找到问题所在。最后我把问题简化成了这个小测试案例:

>>> "{:20}".format(b"hi")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

对我来说,这个问题并不是很明显。解决我代码的方法是把字节字符串解码成unicode格式:

 >>> "{:20}".format(b"hi".decode("ascii"))
 'hi                  '

这个错误是什么意思呢?有没有办法让它更清楚一些?

2 个回答

27

这也会发生在尝试格式化 None 时:

>>> '{:.0f}'.format(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

这让我花了一些时间才搞明白(在我的情况下,是因为一个实例变量返回了 None)!

79

bytes对象没有自己的__format__方法,所以它会使用默认的object方法:

>>> bytes.__format__ is object.__format__
True
>>> '{:20}'.format(object())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: non-empty format string passed to object.__format__

这意味着你不能对这些对象使用任何其他格式化方式,除了简单的、未格式化的、未对齐的格式。要获得格式支持,你需要明确地将bytes转换为字符串对象(就像你通过解码bytesstr所做的那样)。

你可以通过使用!s字符串转换来明确进行转换:

>>> '{!s:20s}'.format(b"Hi")
"b'Hi'               "
>>> '{!s:20s}'.format(object())
'<object object at 0x1100b9080>'

object.__format__明确拒绝格式字符串,以避免隐式的字符串转换,特别是因为格式化指令是与类型相关的。

撰写回答