gpt4 book ai didi

python - 误导 `ValueError` 在 python 2.7 中格式错误

转载 作者:太空宇宙 更新时间:2023-11-04 09:05:09 26 4
gpt4 key购买 nike

当我尝试以下错误代码时:

not_float = [1, 2, 3]
"{:.6f}".format(not_float)

我收到以下误导性 ValueError:

ValueError: Unknown format code 'f' for object of type 'str'

这是一种误导,因为它可能让我认为 not_float 是一个字符串。其他 non_float 类型也会出现相同的消息,例如 NoneTypetuple 等。你知道为什么吗? 并且:无论 non_float 的类型是什么,只要它不为 f 提供某种格式化方法,我都应该期待此错误消息吗?

另一方面,尝试:

non_date = 3
"{:%Y}".format(non_date)

带来

ValueError: Invalid conversion specification

它提供的信息较少,但误导性也较少。

最佳答案

str.format()方法和format()函数,调用对象的.__format__()方法正在传递,传递 : 冒号后的所有内容(在本例中为 .6f)。

该方法的默认 object.__format__() 实现是调用 str(self) 然后对该结果应用 format() .这是用 C 实现的,但在 Python 中看起来像:

def __format__(self, fmt):
return format(str(self), fmt)

正是这个调用引发了异常。对于 list 对象,例如:

>>> not_float.__format__('.6f')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'f' for object of type 'str'

因为这在功能上与:

>>> format(str(not_float), '.6f')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'f' for object of type 'str'

整数有一个自定义的 .__format__ 实现;它在内部不使用 str(),因为有特定于整数的格式化选项。它以不同的方式将值转换为字符串。结果,它抛出了一个不同的异常,因为它没有将 %Y 识别为有效的格式字符串。

错误信息当然可以改进;一个open Python bug讨论这个问题。由于所有这些工作方式的变化,这个问题在 Python 3.4 中不再是问题;如果格式字符串为空 .__format__() 将不再被调用。

关于python - 误导 `ValueError` 在 python 2.7 中格式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21456227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com