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.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 中的错误?
是的,这是 ruamel.yaml 0.14.2 中的错误。
1.1 和 1.2 的整数隐式解析器都包含 0o 模式,只有 1.2 的应该有。旧模式(匹配 052
)仅在要求版本 1.1 时可用。
这应该在 ruamel.yaml>=0.14.3
中修复
我尝试使用 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 中的错误?
是的,这是 ruamel.yaml 0.14.2 中的错误。
1.1 和 1.2 的整数隐式解析器都包含 0o 模式,只有 1.2 的应该有。旧模式(匹配 052
)仅在要求版本 1.1 时可用。
这应该在 ruamel.yaml>=0.14.3
中修复