为什么第一个表达式被解释为int,第二个表达式被解释为字符串?



使用PyYaml

import yaml
yaml.full_load(StringIO('a: 16:00:00'))
# {'a': 57600}
yaml.full_load(StringIO('a: 09:31:00'))
# {'a': '09:31:00'}

为什么这些行为会有差异?

旧版本的YAML支持六进制(60进制)数字,用于表示时间之类的东西。而不是添加额外的数字(如十六进制使用0-9和A-F),它只是使用由:s分隔的十进制数字0-59。因此,16:00:00等价于

16*(60**2) + 0*60 + 0 == 57600.

PyYAML显然仍然使用这个旧的YAML规范。

09:30:00不以有效的十进制开头:前导零表示八进制数,但09不是有效的八进制数。由于无法将其解析为任何类型的已知数字(八进制、十进制或十六进制),PyYAML将其还原为字符串。

YAML可以表示时间戳,但前提是它们由日期和可选的时间戳组成。PyYAML将这样的时间戳解析为datetime.datetime对象,这似乎是合理的。

>>> yaml.full_load(StringIO('a:   2022-12-21T09:31:00'))
{a: datetime.datetime(2022, 12, 21, 9, 31)}

我在评论中引用了一个答案,https://stackoverflow.com/a/45165433/1126841,由另一个遵循YAML 1.2规范的包的作者提供,它将把值解析为字符串,而不是十六进制整数。

>>> from ruamel import yaml
>>> yaml.safe_load('a: 16:00:00')
{'a': '16:00:00'}

这取决于09:31:00的标题0:删除它,你会得到你的int值

最新更新