Python TypeError:传递给object .__ format__的非空格式字符串

时间:2014-06-11 18:57:00

标签: python python-3.x string-formatting

我最近遇到了这个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 个答案:

答案 0 :(得分:69)

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解码为str一样)以获取format spec support

您可以使用!s字符串转换显式转换:

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

object.__format__显式拒绝格式字符串以避免隐式字符串转换,特别是因为格式化指令是特定于类型的。

答案 1 :(得分:23)

尝试格式化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时)!