Python TypeError:传递给对象的非空格式string.__ format__
我最近碰到这个TypeErrorexception,我发现很难debugging。 我最终将其缩小到这个小testing案例:
>>> "{:20}".format(b"hi") Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: non-empty format string passed to object.__format__
无论如何,这是非常不明显的。 我的代码的解决方法是将字节string解码为unicode:
>>> "{:20}".format(b"hi".decode("ascii")) 'hi '
这个例外是什么意思? 有没有办法可以使之更清楚?
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__
这只是意味着你不能使用除了直接的,未格式化的未alignment的格式。 显式转换为一个string对象(就像通过将bytes
解码到str
所做的那样)来获得格式规范支持 。
您可以通过使用!s
string转换来明确转换:
>>> '{!s:20s}'.format(b"Hi") "b'Hi' " >>> '{!s:20s}'.format(object()) '<object object at 0x1100b9080>'
object.__format__
显式拒绝格式化string以避免隐式string转换,具体而言,因为格式化指令是types特定的。
尝试格式化None
时也会发生这种情况:
>>> '{:.0f}'.format(None) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: non-empty format string passed to object.__format__
这花了一些时间来解决(在我的情况下,当一个实例variables返回None
)!