首页 文章

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

提问于
浏览
65

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

  • 61

    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__ 显式拒绝格式字符串以避免隐式字符串转换,特别是因为格式化指令是特定于类型的 .

  • 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 时)!

相关问题