ruamel.yaml 1.1 中的八进制

ruamel.yaml octal in 1.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.1z: 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 中的错误?

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

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

这应该在 ruamel.yaml>=0.14.3

中修复