YAML — один из самых распространенных языков записи конфигураций и сценариев для сетевых приложений. Он используется в Docker-compose и Ansible playbooks. YAML получил такое широкое распространение благодаря человекочитаемому синтаксису и простым правилам оформления файлов.
Данный краткий мануал поможет лучше понять YAML-синтаксис. Приведем правила оформления YAML-файлов:
- начало файла обозначается 3 дефисами(«---»), а конец — 3 точками («…»);
- первый блок (словарь или список) — задает рабочие количество отступов, которое будет использовано во всём документе;
- после знака «-», обозначающего элемент списка, ставится пробел;
- все именованные наборы данных и строки должны иметь уникальные названия.
Синтаксис YAML-файлов
Строка
Строка — простая примитивная запись данных по типу ключ : значение. Строки можно записать двумя способами:
- Однострочной записью
string: This is a string.
- Блочной записью
---
string:
Это очень длинная строка,
которую сложно читать в однострочной записи,
так как она вылезает за пределы окна.
...
Блочная запись имеет три режима интерпретации: стандартный (показан выше), с добавлением знака конца строки в завершении текста (string: > ), с добавлением всех знаков конца строки при каждой новой строке (string: I ).
Несколько строчных записей образуют словарь:
---
string_1: This is string 1.
string_2: This is string 2.
string_3: This is string 3.
...
Такая запись будет интерпретирована так:
{'string_1': 'This is a string 1.', 'string_2': 'This is a string 2.', 'string_3': 'This is a string 3.'}
Список
Список — это набор разнородных данных. Списки могут быть простыми (одномерными), вложенными (вложенными) и именованными. Пример простого, одномерного списка:
---
- element1
- element2
- element3
...
Именованный список по записи похож на строку. Название отделяется двоеточием, а элементы списка перечисляются через дефис:
---
list:
- 2
- element2
- true
...
Вложенные именованные списки образуются добавлением двоеточия к нужному элементу, который станет названием вложенного списка, и добавлением отступов к другим элементам, которые станут элементами вложенного списка:
---
list_level_1:
- 2
- element2
- true
- list_level_2:
- element1
- element2
- element3
...
Образовать простой список с вложенными неименованными списками просто, достаточно указать дефис, сделать отступ и перечислить вложенные элемент:
---
-
- element_1
- element_2
- element_3
-
- element_1
- element_2
- element_3
...
Словарь
Словарь — это набор данных по типу «ключ : значение». Словарь в YAML ничем не отличается от строк, то есть если мы сделаем такую запись:
---
author: Ivan Katkov
job: Tech Writer
skill: Normal
...
Мы получим словарь с 3 ключами, но если запись немного изменить на такую:
---
author:
name: Ivan Katkov
job: Tech Writer
skill: Normal
...
Получится словарь с ключом author, а в качестве значения будет другой словарь, содержащий: name, job и skill.
Мультивложенность элементов
Многоуровневая вложенность формируется отступами и спец. символами: двоеточием — знаком образования строки или ключа словаря и дефисов — символом образования списки или элемента списка.
Структура данных | YAML-синтаксис | Вывод Python |
---|---|---|
Вложенные неименованные списки — дефис обозначает начало списка, а дефис с пробелом и название — является элементом списка. | -1111111111111111111111111 - Яблоки - Груша - Банан - - Картофель - Редька - Капуста - - Лук - Петрушка - Укроп |
[['Яблоки', 'Груша', 'Банан'], ['Картофель', 'Редька', 'Капуста'], ['Лук', 'Петрушка', 'Укроп']] |
Вложенные именованные списки образуются путём замены пустых дефисов, обозначающих список на именованную строку с двоеточием. | Фрукты: - Яблоки - Груша - Банан Овощи: - Картофель - Редька - Капуста Зелень: - Лук - Петрушка - Укроп |
{'Фрукты': ['Яблоки', 'Груша', 'Банан'], 'Овощи': ['Картофель', 'Редька', 'Капуста'], 'Зелень': ['Лук', 'Петрушка', 'Укроп']} |
Вложенные словари формируются с помощью именованных строк, двоеточий и отступов. | Фрукты: Яблоки: Красные: 1кг. Зеленые: 0,5кг. Груши: Гвидон: 0,3кг. Велеса: 0,1кг. |
{'Фрукты': {'Яблоки': {'Красные': '1кг.', 'Зеленые': '0,5кг.'}, 'Груши': {'Гвидон': '0,3кг.', 'Велеса': '0,1кг.'}}} |
Уровень вложенности может быть любым. Чаще всего вам будут попадаться вложенные словари, так как они являются базовой структурой данных в Python и некоторых других языках программирования.