1

我尝试使用 PyYAML 运行此代码:

from yaml import safe_load
data = safe_load("""\
%YAML 1.2
---
x: 42
y: 0x2a
z: 0o52
""")

assert data['x'] == data['y'] == data['z']

没想到它会抛出一个断言错误。在我阅读了更多文档(通过http://yaml.org/找到)后,我意识到 PyYAML 不久前就死了,并且从不支持 YAML 1.2 规范中的八进制整数。

使用 ruamel.yaml ( from ruamel.yaml import safe_load) 可以按预期工作。

只是出于好奇,我尝试了 ruamel.yaml 与旧的八进制格式(YAML 1.1在顶部和z: 052),并且效果也很好。我还尝试了以下方法:

from ruamel.yaml import safe_load
data = safe_load("""\
%YAML 1.1
---
x: 42
y: 0x2a
z: 0o52
""")
assert data['x'] == data['y'] == data['z']

期望它抛出一个错误,data['z']应该是一个字符串,而不是整数 42。这不会抛出一个错误,我认为它应该。

我的期望是错误的,还是 ruamel.yaml 中的错误?

4

1 回答 1

0

是的,这是 ruamel.yaml 0.14.2 中的一个错误。

1.1 和 1.2 的整数的隐式解析器都包括 0o 模式,只有 1.2 的那个应该有。旧模式(匹配052)仅在要求 1.1 版本时可用。

这应该在 ruamel.yaml>=0.14.3 中修复

于 2017-03-31T10:31:04.630 回答