为啥 ---(3 个破折号/连字符)在 yaml 文件中?
Posted
技术标签:
【中文标题】为啥 ---(3 个破折号/连字符)在 yaml 文件中?【英文标题】:why --- (3 dashes/hyphen) in yaml file?为什么 ---(3 个破折号/连字符)在 yaml 文件中? 【发布时间】:2018-11-20 03:30:21 【问题描述】:所以我刚开始使用YAML
文件而不是application.properties
,因为它更具可读性。我在YAML
文件中看到它们以---
开头。我google了一下,找到了下面的解释。
YAML 使用三个破折号(“---”)将指令与文档分开 内容。如果没有,这也用于指示文档的开始 存在指令。
另外,我尝试了一个不带---
的示例,并了解到并非必须拥有它们。
我想我对directive
和document
的理解不是很清楚。谁能用一个简单的例子解释一下?
【问题讨论】:
你检查过 YAML 规范吗?它几乎描述了directive 或document 是什么。对不起,这符合我的书上的idownvotedbecau.se/noresearch。 @lexicore 在尝试示例之前,我检查了文档。但是我没有得到一个清晰的理解,我想如果有人解释我会更好地理解。如果它看起来很基础,我很抱歉,仅供参考,我只是一个初学者。 【参考方案1】:正如您已经发现的,三个破折号---
用于表示文档的开始,即:
根据当前规范,在指令之后发出文档开始信号,即%YAML
或%TAG
行。例如:
%YAML 1.2
%TAG !foo! !foo-types/
---
myKey: myValue
当您同一流中有多个 yaml 文档(例如,一个 yaml 文件)时发出文档开始信号:
doc 1
---
doc 2
如果 doc 2 有一些前面的指令,那么我们必须使用三个点 ...
来向解析器指示 doc 1 的结尾(以及 doc 2 之前的潜在指令的开始)。例如:
doc 1
...
%TAG !bar! !bar-types/
---
doc 2
该规范适用于 yaml 解析器实现者。不过,我发现从用户的角度来看,this article 更容易阅读。
【讨论】:
我阅读了 YAML 1.2 规范中的生产规则 211,即使您在以下文档中有指令,您也不需要文档结束指示符,这是唯一需要的情况是您有一个指令结束指示符(在l-explicit-document
的开头)。
我对三个点的用法的理解是基于the spec的这句话:"如果一个文档没有被文档结束标记行终止,那么后面的文档必须以a开头指令结束标记行。" 要求文档以指令结束标记 ---
开头将意味着该文档不允许使用任何指令。因此,如果 doc 2 有指令,则 doc 1 必须以文档结束标记 ...
终止。
事实上,definition of l-explicit-document 禁止对其使用指令:“显式文档以显式指令结束标记行开头,但没有指令。”
Rule 211 明确包含 l-explicit-document 之外的指令,我不确定您对文本的引用是否与此相矛盾。在任何情况下,Python YAML 解析器都会以这种方式实现它(即,在下一个文档指令之前不需要显式的文档结束指示符)。
我没有看到规则 211 允许 l-explicit-document
之前的指令。表达式l-document-prefix*
不包含指令。我不熟悉 Python Yaml 解析器,但一个有趣的问题是,如果指令前面没有点,它是否只是默默地跳过指令。【参考方案2】:
如果您的YAML
没有以指令开头,则不必拥有它们。如果是这种情况,您应该使用它们。
我们来看看文档
3.2.3.4。指令
每个文档都可能与一组指令相关联。指令具有名称和可选序列 参数。 指令是对 YAML 处理器的指令,并且 像所有其他演示细节一样,YAML 中没有反映 序列化树或表示图。这个版本的 YAML 定义了两个指令,“YAML”和“TAG”。所有其他指令都是 为未来版本的 YAML 保留。
这方面的一个例子也可以在in the documentation 中找到指令YAML
%YAML 1.2 # Attempt parsing
# with a warning
---
"foo"
【讨论】:
以上是关于为啥 ---(3 个破折号/连字符)在 yaml 文件中?的主要内容,如果未能解决你的问题,请参考以下文章