LEARN X · ЗА 8 МИН

TOML

TOML за 8 минут: ключи, типы, строки, числа, даты, таблицы, массивы, inline-таблицы и пример pyproject.toml. Экспресс-тур по формату конфигов.

TOML (Tom's Obvious, Minimal Language) — формат конфигурационных файлов, который читается как обычный текст и однозначно превращается в хеш-таблицу. Весь язык умещается на одной странице — изучаем его прямо в комментариях кода.

Что такое TOML и где применяется

# TOML — формат для конфигов, придуманный Томом Престоном-Вернером.
# Цель: быть очевидным для человека и легко парситься в словарь/хеш.
# Расширение файла — .toml

# Где встречается:
#   Cargo.toml      — манифест пакетов в Rust
#   pyproject.toml  — конфиг сборки и инструментов в Python
#   config.toml     — Hugo, многие CLI-утилиты и сервисы

# Комментарий начинается с решётки и идёт до конца строки.
key = "value"  # комментарий можно писать и после значения

# Файл TOML целиком — это одна большая таблица (словарь).
# Регистр важен: Name и name — разные ключи.

Ключи и значения

Базовая единица TOML — пара key = value. Пробелы вокруг знака равно игнорируются, но пара обязана уместиться в одной строке.

# Простой ключ: буквы, цифры, _ и - без кавычек
name = "codechick"
port = 8080

# Ключ в кавычках — если нужны пробелы, точки или спецсимволы
"ключ с пробелами" = true
"127.0.0.1" = "localhost"

# Точечные ключи создают вложенные таблицы на лету:
server.host = "example.com"   # это таблица server с ключом host
server.port = 443             # та же таблица server
# Эквивалентно:  server = { host = "example.com", port = 443 }

# Дублировать один и тот же ключ нельзя — это ошибка.

Строки

# Базовая строка (basic) — в двойных кавычках, понимает экранирование
greeting = "Привет,\nмир!"        # \n — перевод строки, \t — таб
path = "C:\\Users\\dev"           # обратный слеш экранируется как \\
unicode = "\u0041"                # \u и \U — символы по коду (A)

# Литеральная строка (literal) — в одинарных кавычках, БЕЗ экранирования
winpath = 'C:\Users\dev'          # слеши остаются как есть
regex = '\d{3}-\d{2}'             # удобно для регулярок и путей

# Многострочная базовая — три двойные кавычки
bio = """
Первая строка
Вторая строка"""
# Обратный слеш в конце строки "съедает" перенос и пробелы:
long = """один \
          два"""            # получится: один два

# Многострочная литеральная — три одинарные кавычки, всё дословно
verse = '''
текст 'с кавычками' внутри
и \без экранирования'''

Числа, булевы значения и даты

TOML различает целые и дробные числа, логические значения и полноценные даты по стандарту RFC 3339.

# Целые числа (integer) — можно с разделителями-подчёркиваниями
count = 42
big = 1_000_000          # _ для читаемости, на значение не влияет
negative = -17
hex = 0xDEADBEEF         # 16-ричное
octal = 0o755            # 8-ричное
binary = 0b1010          # 2-ичное

# Числа с плавающей точкой (float)
ratio = 3.14
exp = 5e3                # 5000.0
inf = inf                # бесконечность; есть -inf и nan

# Булевы значения (boolean) — только в нижнем регистре
enabled = true
debug = false

# Дата и время (datetime) — без кавычек, по RFC 3339
moment = 2026-06-16T09:30:00Z          # дата-время со смещением UTC
local = 2026-06-16T12:00:00+03:00      # со своим часовым поясом
day = 2026-06-16                       # только дата
clock = 09:30:00                       # только время

Таблицы

Таблица — это именованная группа ключей, объявляется заголовком в квадратных скобках. Всё, что идёт после заголовка, попадает внутрь этой таблицы.

# Заголовок таблицы — имя в квадратных скобках
[database]
host = "localhost"      # это database.host
port = 5432             # это database.port

[server]
ip = "0.0.0.0"          # новая таблица — отсчёт пошёл заново

# Вложенные таблицы — точка в имени заголовка
[server.tls]
enabled = true          # это server.tls.enabled
cert = "/etc/cert.pem"

# Промежуточные таблицы создаются автоматически:
[a.b.c]
value = 1               # a и a.b возникнут сами собой

Массивы

# Массив — значения в квадратных скобках через запятую
ports = [8000, 8001, 8002]
names = ["alice", "bob", "carol"]
flags = [true, false, true]

# Массив можно разбить на несколько строк, пробелы не важны
colors = [
  "red",
  "green",
  "blue",          # завершающая запятая разрешена
]

# Массивы могут быть вложенными
matrix = [[1, 2], [3, 4]]

# Типы внутри одного массива можно смешивать (TOML 1.0)
mixed = [1, "два", 3.0, true]

Массивы таблиц

Двойные квадратные скобки [[name]] создают массив таблиц — каждый такой заголовок добавляет новый элемент списка.

# Каждый блок [[products]] — отдельный элемент массива
[[products]]
name = "Молоток"
sku = 738594937

[[products]]
name = "Гвоздь"
sku = 284758393
color = "серый"

# В итоге получится:
# products = [
#   { name = "Молоток", sku = 738594937 },
#   { name = "Гвоздь",  sku = 284758393, color = "серый" },
# ]

# Массивы таблиц можно вкладывать друг в друга
[[fruits]]
name = "яблоко"

  [[fruits.varieties]]    # вложенный массив внутри элемента fruits
  name = "антоновка"

  [[fruits.varieties]]
  name = "гала"

Inline-таблицы

# Inline-таблица — компактная запись таблицы в фигурных скобках,
# целиком на одной строке. Удобна для коротких сгруппированных значений.
point = { x = 1, y = 2 }

server = { host = "localhost", port = 5432, ssl = true }

# Значениями могут быть и массивы
range = { min = 0, max = 100, steps = [10, 20, 30] }

# Правила: всё в одной строке, нельзя дополнять её позже
# отдельными ключами или заголовком [server.x].

Сравнение с JSON и YAML

# TOML против соседей по конфигам:
#
# JSON — машинно-строгий, но многословный: кавычки у каждого ключа,
#        нет комментариев, легко промахнуться с запятой.
#
# YAML — лаконичный, но отступы значимы: лишний пробел ломает файл,
#        а неявные правила типов дают сюрпризы (norway-problem:
#        no превращается в false).
#
# TOML — золотая середина: комментарии есть, отступы не важны,
#        типы явные, структура читается сверху вниз.
#        Минус — для глубоко вложенных деревьев многословнее YAML.
#
# Один и тот же конфиг:
# JSON:  { "server": { "port": 8080 } }
# YAML:  server:\n  port: 8080
# TOML:  [server]\n  port = 8080

Практический пример: pyproject.toml

Соберём всё вместе на живом конфиге Python-проекта — здесь встречаются таблицы, вложенные таблицы, массивы и массивы таблиц.

# --- система сборки (PEP 518) ---
[build-system]
requires = ["hatchling"]            # массив строк-зависимостей
build-backend = "hatchling.build"

# --- метаданные проекта (PEP 621) ---
[project]
name = "codechick"
version = "1.0.0"
description = "Учебная платформа"
requires-python = ">=3.11"
readme = "README.md"
keywords = ["education", "python", "toml"]

# Список зависимостей пакета
dependencies = [
  "django>=5.0",
  "requests>=2.31",
]

# Авторы — массив inline-таблиц
authors = [
  { name = "Эрнест", email = "[email protected]" },
]

# Опциональные группы зависимостей (вложенная таблица)
[project.optional-dependencies]
dev = ["pytest>=8.0", "ruff"]

# Ссылки проекта
[project.urls]
Homepage = "https://codechick.io"

# --- конфиг инструмента (линтер ruff) ---
[tool.ruff]
line-length = 100
target-version = "py311"

[tool.ruff.lint]
select = ["E", "F", "I"]            # включённые наборы правил
ignore = ["E501"]                  # игнорируемые проверки
Поддержать проект