根据 YAML 1.1 规范,“是”真的是“真”的别名吗? 1.2 规格?

问题描述 投票:0回答:3

我正在尝试调试一个问题,归结为...

>>> 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中,并被删除在修改之后。

我怀疑我在写它的过程中已经回答了我自己的问题,但是......这个关于“是/否”的业务只是胡说八道而进入了实施(我的编辑甚至突出显示“是/否”作为特殊),或者我误解或遗漏了规范的一部分?

python yaml pyyaml ruamel.yaml
3个回答
6
投票
在 yaml 规范 1.1 中将

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 仍然有这些。

3
投票
语言独立类型存储库的部分

不幸的是,该存储库中的某些区域与 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

-3
投票
ruamel.yaml

可以回答这个

我的编辑甚至特别强调“是/否”
注意线
json

pyyaml:基于 yaml 1.1,正在努力添加对 YAML 1.2 Core 和 JSON 模式的支持

pyyaml 流行:

ruamel-yaml:用于 Python 的 YAML 1.2 加载程序/转储程序包

它是pyyaml 3.11的衍生版本(截至2023-01-29,最新的pyyaml是6.0)。它在 sourceForge 而不是 github 上。

© www.soinside.com 2019 - 2024. All rights reserved.