чому - (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.