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


116

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

YAML використовує три тире ("---") для відділення директив від змісту документа. Це також служить сигналом початку документа, якщо директив немає.

Також я спробував зразок без ---і зрозумів, що їх не обов’язково мати.

Я думаю, я не маю чіткого розуміння directiveі document. Хто-небудь може пояснити, будь ласка, простим прикладом?


3
Ви перевірили специфікацію YAML? Він в значній мірі описує, що таке директива чи документ . Вибачте, це відповідає вимогам idownvotedbecau.se/noresearch у моїй книзі.
lexicore

19
@lexicore Я перевірив документи, перш ніж спробувати приклад. Але я не зрозумів чітко і думав, що краще зрозумію, якщо хтось пояснить. Мені шкода, якщо це виявилося дуже базовим, FYI, я лише початківець.
Енді

Відповіді:


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 parser. Однак мені ця стаття легше читати з точки зору користувача.


Я читаю правило 211 виробництва в специфікації YAML 1.2 таким чином, що вам не потрібен індикатор закінчення документа, навіть якщо у наступному документі є директиви. Єдине, що потрібно в цьому випадку, це те, що у вас є кінцевий- Індикатор директив (на початку l-explicit-document).
Антон

Моє розуміння використання трьох крапок ґрунтується на цьому реченні специфікації : "Якщо документ не закінчується кінцевим маркером рядка документа, наступний документ повинен починатися з кінцевої лінії маркера директиви." Потрібно, щоб документ розпочався з кінцевий маркер директив ---означав би, що для цього документа не допускаються директиви. Отже, якщо doc 2 має директиви, doc 1 повинен бути припинений маркером кінця документа ....
Yi Ou

Фактично, визначення l -plicit-document забороняє директиви щодо нього: "Явний документ починається з явної директиви кінцевою лінією маркера, але немає директив".
Yi Ou

Правило 211 явно містить директиви поза l-явним документом, і я не впевнений, чи цитуючи цей текст навіть це суперечить. У будь-якому випадку, парсери YAML Python дійсно реалізують це (тобто вам не потрібен явний індикатор закінчення документа перед наступними директивами щодо документів).
Антон

Я не бачу правила 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.