【问题标题】:Python TypeError: non-empty format string passed to object.__format__Python TypeError:传递给object.__format__的非空格式字符串
【发布时间】:2014-06-11 18:56:59
【问题描述】:

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

这对我来说非常不明显。我的代码的解决方法是将字节字符串解码为 un​​icode:

 >>> "{:20}".format(b"hi".decode("ascii"))
 'hi                  '

这个异常是什么意思?有没有办法让它更清楚?

【问题讨论】:

  • 可能值得注意的是:这只是在 Python 3.4+ 中变成了 TypeError,它会影响从 object 继承的任何东西,而无需一路定义 __format__(例如 None;@987654328 @等)。
  • 背景信息见bugs.python.org/issue7994
  • 我也遇到了这个问题,终于发现应该包含float的变量,居然包含None。因此'{0:.4f}'.format(bla) 导致了这个异常

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


【解决方案1】:

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

【讨论】:

  • 有道理,谢谢!我希望错误更直观!
【解决方案2】:

尝试格式化 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 被实例变量返回时)!

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2015-06-19
    • 2017-12-30
    • 2021-10-31
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多