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
Поддержать проект