Python 类型错误:非空格式字符串传递给 object.__format__
我最近遇到了一个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
转换为字符串对象(就像你通过解码bytes
为str
所做的那样)。
你可以通过使用!s
字符串转换来明确进行转换:
>>> '{!s:20s}'.format(b"Hi")
"b'Hi' "
>>> '{!s:20s}'.format(object())
'<object object at 0x1100b9080>'
object.__format__
明确拒绝格式字符串,以避免隐式的字符串转换,特别是因为格式化指令是与类型相关的。