为啥 ---(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 使用三个破折号(“---”)将指令与文档分开 内容。如果没有,这也用于指示文档的开始 存在指令。

另外,我尝试了一个不带--- 的示例,并了解到并非必须拥有它们。

我想我对directivedocument 的理解不是很清楚。谁能用一个简单的例子解释一下?

【问题讨论】:

你检查过 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 文件中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将带有破折号的字符串转换为 wstring?

为啥 .NET GUID 中有破折号?

当一条线有破折号而同一级别的其他线没有破折号时,啥是 yaml 结构?

为啥 PuTTYcyg 在手册页中显示 â 而不是连字符?

YAML集合和结构

为啥在 PEP 0263 正则表达式中使用 `.`?