为什么在Yaml文件中(3个破折号/连字符)?


116

所以我只是开始使用YAML文件,而不是application.properties因为它更具可读性。我在YAML文件开头看到---。我用谷歌搜索并找到以下解释。

YAML使用三个破折号(“ ---”)将指令与文档内容分开。如果不存在指令,这也可以用来指示文档的开始。

另外,我尝试了一个没有样本的样本,---并且了解到并不一定要拥有它们。

我觉得我没有一个清醒的认识directivedocument。谁能用一个简单的例子解释一下?


3
您检查了YAML规范吗?它几乎描述了指令文档是什么。抱歉,我的书符合idownvotedbecau.se/noresearch的资格。
lexicore

19
@lexicore在尝试示例之前,我检查了文档。但是我没有一个清晰的理解,我想如果有人解释我会更好的理解。很抱歉,如果它看起来很基础,我仅供参考。
安迪(Andy)

Answers:


66

您已经发现,三个破折号---用于表示文档的开始,即:

  1. 为了指示文档从指令开始,即根据当前规范的%YAML%TAG之后。例如:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. 当您在同一个流中多个yaml文档(例如yaml文件)时,要发出信号指示文档开始:

    doc 1
    ---
    doc 2
    

    如果doc 2有一些前面的指令,那么我们必须使用三个点...来向解析器指示doc 1的结尾(以及doc 2之前的潜在指令的开始)。例如:

    doc 1
    ...
    %TAG !bar! !bar-types/
    ---
    doc 2
    

该规范对yaml解析器实现者很有用。但是,我发现从用户角度更容易阅读本文


我以这种方式阅读了YAML 1.2规范中的生产规则211,即使您在以下文档中有指令,也不需要文档结尾指示符,在这种情况下,唯一需要做的就是指令指示符(位于的开头l-explicit-document)。
安东

我对这三个点的用法的理解基于该规范的句子:“如果文档未由文档结束标记行终止,则以下文档必须以指令结束标记行 开头。”要求文档以以下开头指令结束标记---将意味着该文档不允许使用任何指令。因此,如果doc 2具有指令,则doc 1必须以文档结束标记终止...
义欧

实际上,l-explicit-document定义禁止使用指令:“显式文档以显式指令结束标记行开头,但不包含任何指令。”
义欧

规则211显式地在l-explicit-document之外包含指令,并且我不确定您对文本的引用是否与之矛盾。无论如何,Python YAML解析器都以这种方式实现它(即,在下一个documents指令之前,您不需要显式的document-of-结束指示符)。
安东,

我看不到规则211允许在前面加上指令l-explicit-document。该表达式l-document-prefix*不包含指令。我对Python Yaml解析器不熟悉,但是一个有趣的问题是,如果指令前没有点号,它是否会无提示地跳过指令。
Yi Ou

55

如果您不YAML以指令开头,则不一定要拥有它们。如果是这样,您应该使用它们。

让我们看一下文档

3.2.3.4。指令

每个文档可以与一组指令关联。指令具有名称和可选的参数序列。指令是发给YAML处理器的指令,并且像所有其他表示形式的详细信息一样,它们也不会反映在YAML序列化树或表示图中。此版本的YAML定义了两个指令:“ YAML”和“ TAG”。所有其他指令均保留用于YAML的将来版本。

关于此指令的一个示例也可以指令文档中找到YAML

%YAML 1.2 # Attempt parsing
           # with a warning
---
"foo"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.