Python TypeError:传递给对象的非空格式字符串。__format__


78

我最近遇到了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                  '

此异常的含义是什么?有没有一种方法可以使它更清晰?


7
可能值得注意的是:这仅TypeError在Python 3.4+中才成为,并且会影响沿袭object而未定义__format__的所有内容(例如None;class T(object): pass等)。
亨利·基特

1
有关背景信息,请参见bugs.python.org/issue7994
gerrit

2
我也遇到了这个问题,最后发现应该包含浮点数的变量实际上包含了None。因此'{0:.4f}'.format(bla)导致了此异常
SomethingSomething '18

Answers:


77

bytes对象没有自己的__format__方法,因此使用默认的from 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)以获取格式规范支持

您可以使用!s字符串转换使转换明确:

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

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


11
很有道理,谢谢!我希望错误会更直观!
克里斯·阿特里

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实例变量返回时)!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.