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所做的那样)来获得格式规范支持 。

您可以通过使用!sstring转换来明确转换:

 >>> '{!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 )!