jbe*_*man 7 python yaml pyyaml ruamel.yaml
我正在尝试调试一个问题,它归结为......
>>> import yaml as pyyaml
>>> import ruamel.yaml as ruamel
>>> ruamel.load("x: yes") == ruamel.load("x: true")
False
>>> pyyaml.safe_load("x: yes") == pyyaml.safe_load("x: true")
True
Run Code Online (Sandbox Code Playgroud)
互联网上有传言称“yes”和“no”是保留词,分别是和 的同义词。truefalse
但 1.1 规范中只是顺便提及,但没有详细说明,并且字符串“yes”根本没有出现在1.2 规范中。
事实上,仔细查看规范的每个草案,它只会以合法的方式以任何合法的方式出现在https://yaml.org/spec/history/2002-09-01.html中,并在之后的修订中被删除。
我怀疑我在写它的过程中已经回答了我自己的问题,但是......这个关于“是/否”的事情只是胡说八道吗?它进入了实现(我的编辑甚至强调“是/否”作为特殊),或者我误解或遗漏了规范的一部分?
在这方面很难比较 YAML 1.2 和 YAML 1.1。YAML 1.2具有 YAML 1.1 中没有的架构。
YAML 1.2 规范(base、json、core)中没有提到任何模式Yes作为布尔类型,并且示例不再使用这些,而 YAML 1.1 仍然有这些。
然而,YAML 1.2 规范确实提到了核心架构之外的可能架构,包括语言独立类型存储库的部分 内容。不幸的是,该存储库中的某些区域与 YAML 1.2 相矛盾(例如八进制的表示方式)。因此,在 YAML 1.2 中完全兼容 1.1 的通用是不可能的。
鉴于没有提及Yes为布尔值,以及它引起的普遍混乱(有人质疑为什么Yes在此处转储时引用了 SO),当我在ruamel.yaml. 其他不那么令人困惑(IMO)和有用的东西,如合并键 ( <<) 都在其中ruamel.yaml(还有不太有用的元素,如值键)。
然而,PyYAML 仅支持 YAML 1.1 标准(于 2009 年被替换)。
如果您的文档不是隐式的,但有标题:
%YAML 1.1
---
x: yes
Run Code Online (Sandbox Code Playgroud)
然后也ruamel.yaml将加载yes为布尔值,ruamel.yaml默认情况下加载 YAML 1.2,而 PyYAML 仍然仅(部分)支持加载 YAML 1.1