почему - (3 тире / дефис) в файле yaml?

116

Поэтому я просто начал использовать YAMLфайл вместо того, чтобы application.propertiesон был более читабельным. Я вижу в YAMLфайлах, с которых они начинаются ---. Я погуглил и нашел объяснение ниже.

YAML использует три дефиса («---») для отделения директив от содержимого документа. Это также служит сигналом о начале документа, если нет директив.

Также пробовал образец без --- и понял, что это не обязательно.

Думаю, у меня нет четкого понимания directiveи document. Может ли кто-нибудь объяснить на простом примере?

Энди
источник
3
Вы проверили спецификацию YAML? Он в значительной степени описывает, что такое директива или документ . Извините, это соответствует критериям idownvotedbecau.se/noresearch по моей книге.
lexicore
19
@lexicore Я проверил документацию, прежде чем попробовать пример. Но я не получил четкого понимания, и я думал, что пойму лучше, если кто-то объяснит. Прошу прощения, если это показалось очень простым, к вашему сведению, я только новичок.
Энди

Ответы:

66

Как вы уже выяснили, три тире ---используются для обозначения начала документа , то есть:

  1. Чтобы сигнализировать о начале документа после директив , т. Е. %YAMLИли %TAGстрок в соответствии с текущей спецификацией. Например:

    %YAML 1.2
    %TAG !foo! !foo-types/
    ---
    myKey: myValue
    
  2. Чтобы сигнализировать о начале документа, когда у вас есть несколько документов yaml в одном потоке , например, файл yaml:

    doc 1
    ---
    doc 2
    

    Если в документе 2 есть предыдущие директивы, то мы должны использовать три точки, ...чтобы указать анализатору конец документа 1 (и начало потенциальных директив, предшествующих документу 2). Например:

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

Спецификация хороша для разработчиков парсеров yaml. Однако я считаю, что эту статью легче читать с точки зрения пользователя.

Йи Оу
источник
Я прочитал производственное правило 211 в спецификации YAML 1.2 таким образом, что вам не нужен индикатор конца документа, даже если у вас есть директивы в следующем документе, единственное, что требуется в этом случае, это то, что у вас есть конец индикатор директив (в начале l-explicit-document).
Anthon
Мое понимание использования трех точек основано на этом предложении спецификации : «Если документ не заканчивается линией маркера конца документа, то следующий документ должен начинаться с линии маркера конца директивы». Требование, чтобы документ начинался с маркер конца директив ---означает, что для этого документа директивы не разрешены. Таким образом, если документ 2 имеет директивы, документ 1 должен заканчиваться маркером конца документа ....
Йи Оу
Фактически, определение l-explicit-document запрещает для него директивы: «Явный документ начинается с явной строки маркера конца директив, но без директив».
Йи Оу
Правило 211 явно имеет директивы за пределами l-explicit-document, и я не уверен, противоречит ли ваше цитирование текста этому. В любом случае парсеры Python YAML реализуют это таким образом (т.е. вам не нужен явный индикатор конца документа перед следующими директивами документов).
Anthon
Я не вижу предшествующих разрешающих директив Правил 211 l-explicit-document. Выражение l-document-prefix*не содержит директив. Я не знаком с парсером Python Yaml, но интересный вопрос, будет ли он просто молча пропускать директивы, если им не предшествуют точки.
Йи Оу
55

Их необязательно иметь, если вы не начинаете YAMLс директивы. В таком случае вам следует их использовать.

Заглянем в документацию

3.2.3.4. Директивы

Каждый документ может быть связан с набором директив. У директивы есть имя и необязательная последовательность параметров. Директивы представляют собой инструкции для процессора YAML и, как и все другие детали представления, не отражаются в дереве сериализации YAML или графе представления . Эта версия YAML определяет две директивы: «YAML» и «TAG». Все остальные директивы зарезервированы для будущих версий YAML.

Один из примеров этого также можно найти в документации для директивыYAML

%YAML 1.2 # Attempt parsing
           # with a warning
---
"foo"
Ясин Хаджадж
источник