LEARN X · ЗА 10 МИН
YAML
Экспресс-тур по YAML за 10 минут: синтаксис, скаляры, списки, словари, якоря, многострочные строки и практика в Docker и CI.
YAML (YAML Ain't Markup Language) — человекочитаемый формат для конфигов и данных. Весь синтаксис уместился на одной странице: читай комментарии в коде.
1. Что такое YAML и синтаксис
Структура задаётся отступами из пробелов. Табы запрещены.
# Это комментарий — начинается с решётки
# YAML описывает данные: пары ключ-значение, списки, словари
ключ: значение # пара «ключ: значение», после двоеточия — пробел
город: Москва # строку можно без кавычек
# Вложенность задаётся ОТСТУПАМИ (обычно 2 пробела), а не скобками
сервер:
host: localhost # вложенный ключ — с отступом
port: 8080 # все ключи одного уровня — одинаковый отступ
2. Скаляры
Скаляр — одиночное значение: строка, число, булево, null.
# Строки
bez_kavychek: просто текст # кавычки не обязательны
dvoinye: "текст с : двоеточием" # двойные — поддерживают \n, \t
odinarnye: 'текст с # решёткой' # одинарные — всё буквально, без экранирования
# Числа
celoe: 42
otricatelnoe: -7
drobnoe: 3.14
nauchnoe: 1.2e+5 # 120000.0
# Булевы значения
vkljucheno: true # также: True, yes, on
vykljucheno: false # также: False, no, off
# Пустое значение (null)
pusto: null
tozhe_pusto: ~ # тильда — тоже null
vovse_pusto: # ничего после двоеточия — тоже null
3. Списки
# Каждый элемент — с дефиса и пробела
frukty:
- яблоко
- груша
- банан
# Вложенные списки
matrica:
- - 1
- 2
- - 3
- 4
# Inline-форма (flow) — в квадратных скобках
cveta: [красный, зелёный, синий]
chisla: [1, 2, 3]
4. Словари
# Словарь — набор пар ключ: значение
polzovatel:
imja: Анна
vozrast: 30
# Вложенные словари
kompanija:
nazvanie: Acme
adres:
gorod: Казань
indeks: 420000
# Inline-форма (flow) — в фигурных скобках
tochka: {x: 10, y: 20}
5. Многострочные строки
| сохраняет переводы строк, > сворачивает их в пробелы.
# Literal | — переносы строк СОХРАНЯЮТСЯ как есть
zapros: |
SELECT *
FROM users
WHERE active = 1
# Folded > — переносы строк превращаются в ПРОБЕЛЫ (один абзац)
opisanie: >
Этот длинный текст
будет склеен в одну
строку через пробелы.
# Управление концевым переводом строки:
bez_konca: |- # минус — убрать финальный \n
ровно одна строка
so_vsemi: |+ # плюс — сохранить все концевые \n
строка
6. Вложенные структуры
Реалистичная комбинация: списки словарей и словари списков.
# Список словарей — типичный массив объектов
sotrudniki:
- imja: Иван
dolzhnost: разработчик
jazyki: [Python, Go] # значение элемента — список
- imja: Мария
dolzhnost: дизайнер
jazyki: [Figma]
# Словарь, где значения — списки
komandy:
backend:
- Иван
- Олег
frontend:
- Мария
7. Якоря и ссылки
Якорь & задаёт фрагмент, * его подставляет, << сливает словари.
# &anchor — пометить значение якорем
defaults: &defaults
retries: 3
timeout: 30
# *alias — подставить помеченное значение
bystryj: *defaults # скопирует {retries: 3, timeout: 30}
# Merge key << — слить словарь и переопределить часть полей
production:
<<: *defaults # подмешать defaults
timeout: 60 # переопределить timeout
# Якорь работает и для скаляров
bazovyj_url: &url https://api.example.com
polnyj: *url
8. Типы данных и явное приведение
Теги !! заставляют интерпретировать значение нужным типом.
# Явные теги типов
kak_stroka: !!str 123 # "123", а не число
kak_chislo: !!int "42" # 42, а не строка
kak_float: !!float "3.0" # 3.0
kak_bool: !!bool "true" # true
# Даты и время распознаются автоматически (ISO 8601)
data: 2026-06-16
moment: 2026-06-16T12:30:00Z
# Зачем приводить: номер телефона/версия должны быть строкой
versija: !!str 1.10 # иначе 1.1 (как число)
telefon: "+7 900 000" # кавычки тоже спасают
9. Несколько документов
Один файл может содержать несколько документов через ---.
--- # начало первого документа
imja: dev
port: 3000
--- # начало второго документа
imja: prod
port: 80
... # многоточие — явный конец потока (необязательно)
10. YAML на практике
docker-compose
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80" # хост:контейнер — в кавычках, чтобы не спутать с числом
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
CI-конфиг (GitHub Actions)
name: CI
on: [push] # запускать при push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install -r requirements.txt
- run: pytest
Настройки приложения
app:
name: MyApp
debug: false
database:
url: postgres://localhost/app
pool_size: 10
features:
- auth
- billing
11. Типичные ошибки
# ОШИБКА: табы для отступов — запрещены, только пробелы
# server:
# port: 8080 # таб → ошибка парсинга
server:
port: 8080 # правильно: 2 пробела
# ОШИБКА: разные отступы на одном уровне
# spisok:
# - a
# - b # лишний отступ ломает структуру
# ОШИБКА: двоеточие в значении без кавычек
# vremja: 12:30 # парсер может понять как пару/время неверно
vremja: "12:30" # правильно: взять в кавычки
# ОШИБКА: значение, похожее на булево/число, как строка
# strana: NO # NO → false!
strana: "NO" # правильно: код страны строкой
versija: "1.20" # иначе станет числом 1.2