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

发布于 2021-01-29 19:34:24

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

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

关注者
0
被浏览
89
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看