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

这个例外是什么意思?有没有办法让事情变得更清楚?

推荐答案

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__

这只意味着你不能在这些文件上使用任何东西,除了直接的、未格式化的、未对齐的格式.显式地转换为字符串对象(就像您解码bytesstr那样)以获得format spec support.

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

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

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

Python-3.x相关问答推荐

根据收件箱内部的值以行降序的特定顺序重新排序列

如何在python中有效地使用多处理和pytube库来加快下载速度?

使用PANAS根据另两个列表中的值对一个列表中的字符串值进行分组

Python3和请求-超文本标记语言:试图抓取一个网站-没有取回真正的超文本标记语言代码

无法使用诗词安装PyYaml

我想判断df_entry_log[AM_PM],并根据测试填充列

在Python代码中包含NAN值时,以两个矩阵计算RMSE

如何计算累积几何平均数?

tkinter/python3.9 中的 Entry 子类和用户输入重复的问题

在REPLACE INTO中引用变量会抛出sqlite3.OperationalError

pip install saxonche v 12.1.0 产生 FileNotFoundError

如何将列表和字典逐行组合在一起

过滤并获取数据框中条件之间的行

numpy.ndarray 与 pandas.DataFrame

使用 pytest.fixture 返回模拟对象的正确方法

使用 Python3 与 HDFS 交互的最佳模块是什么?

Python在OrderedDict中 Select 第i个元素

如何强制 Sphinx 使用 Python 3.x 解释器

哪个更有效:Python 文档字符串还是类型提示?

三个参数的reduce函数