我正在尝试调试一个问题,归结为...
>>> 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
网上有谣言关于“是”和“否”是保留字,也是true
和
false
的同义词。但是在1.1 spec中只有
passing mention而没有详细说明,而在1.2 spec中根本没有出现字符串“yes”。
事实上,通过规范的每个草案,它只会以合法的方式以任何合法的方式出现在https://yaml.org/spec/history/2002-09-01.html中,并被删除在修改之后。
我怀疑我在写它的过程中已经回答了我自己的问题,但是......这个关于“是/否”的业务只是胡说八道而进入了实施(我的编辑甚至突出显示“是/否”作为特殊),或者我误解或遗漏了规范的一部分?
yes
/
no
解释为
true
/
false
是有意设计的,并且已被记录。然而,在 yaml 规范 1.2 中,将
yes
/
no
解释为
true
/
false
被删除了。来自
PyYAML 文档,
PyYAML 支持 YAML 1.1 标准,
ruamel.yaml
支持 YAML 1.2 于 2009 年发布。YAML 1.2 放弃了对未引用的几个功能的支持
很难在这方面比较 YAML 1.2 和 YAML 1.1。YAML 1.2具有 YAML 1.1 中不存在的模式。YAML 1.2 规范(基础、json、核心)中提到的模式都没有提到Yes
作为布尔类型,并且示例不再使用这些,而 YAML 1.1 仍然有这些。
不幸的是,该存储库中的某些区域与 YAML 1.2 相矛盾(例如八进制的表示方式)。所以在 YAML 1.2 中完全兼容 1.1 是不可能的。 考虑到没有提到
No
作为布尔值,以及它引起的一般混乱(有关于为什么
On
在转储到这里时被引用的问题),我决定在实现 YAML 1.2 时放弃对此的支持支持Off
。其他不那么令人困惑的(IMO)和有用的东西,如合并键(Yes
)在
Yes
中(因此不太有用的元素,如值键)。
PyYAML 然而只支持 YAML 1.1 标准(在 2009 年被取代)。
如果您的文档不是隐含的,但有一个标题:
Yes
然后
ruamel.yaml
也将加载 <<
作为布尔值,因为
ruamel.yaml
默认默认加载 YAML 1.2,而 PyYAML 仍然仅(部分)支持加载 YAML 1.1
现在yaml 1.1和1.2都在使用,所以可能同时有1.2的解析器和1.1的语法高亮,这可能会造成混淆。
neovim0.8.2中的syntax/yaml.vim是针对yaml 1.2的,涉及3种方案:
%YAML 1.1
---
x: yes
、ruamel.yaml
、yes
ruamel.yaml
我的编辑甚至特别强调“是/否”注意线
json
pyyaml:基于 yaml 1.1,正在努力添加对 YAML 1.2 Core 和 JSON 模式的支持
pyyaml 流行:
ruamel-yaml:用于 Python 的 YAML 1.2 加载程序/转储程序包