YAML за 5 минут: синтаксис и основные возможности
YAML — это язык для сериализации данных, который используют DevOps и дата-сайентисты. Рассказываем про синтаксис YAML-файлов.
YAML — это язык для сериализации данных, который отличается простым синтаксисом и позволяет хранить сложноорганизованные данные в компактном и читаемом формате. Рассказываем, как это пригодится для DevOps и виртуализации.
- Что такое YAML?
- YAML vs JSON vs XML
- Характерные особенности YAML
- Синтаксис YAML
- Что ещё может YAML?
Что такое YAML?
YAML — это язык для хранения информации в формате понятном человеку. Его название расшифровывается как, «Ещё один язык разметки». Однако, позже расшифровку изменили на — «YAML не язык разметки», чтобы отличать его от настоящих языков разметки.
Язык похож на XML и JSON, но использует более минималистичный синтаксис при сохранении аналогичных возможностей. YAML обычно применяют для создания конфигурационных файлов в программах типа Инфраструктура как код (Iac), или для управления контейнерами в работе DevOps.
Чаще всего с помощью YAML создают протоколы автоматизации, которые могут выполнять последовательности команд записанные в YAML-файле. Это позволяет вашей системе быть более независимой и отзывчивой без дополнительного внимания разработчика.
Всё больше и больше компаний используют DevOps и виртуализацию, поэтому YAML — это must have для современного разработчика. Кроме того, YAML легко интегрировать, благодаря поддержке Python (используя PyYAML библиотеку, Docker или Ansible) и других популярных технологий.
YAML vs JSON vs XML
YAML (.yml)
- понятный человеку код;
- минималистичный синтаксис;
- заточен под работу с данными;
- встроенный стиль, похожий на JSON (YAML является его надмножеством);
- поддерживает комментарии;
- поддерживает строки без кавычек;
- считается «чище», чем JSON;
- дополнительные возможности (расширяемые типы данных, относительные якоря и маппинг типов с сохранением порядка ключей).
Применение: YAML лучше всего подходит для приложений с большим объемом данных, которые используют DevOps конвейеры или виртуальные машины. Кроме того, улучшение читаемости данных пригодится в командах, где разработчики часто с ними взаимодействуют.
JSON
- труднее читать;
- явные, строгие требования к синтаксису;
- встроенный стиль, похожий на YAML (некоторые парсеры YAML могут читать JSON-файлы);
- нет комментариев;
- строкам нужны двойные кавычки.
Применение: JSON используется в веб-разработке — это лучший формат для сериализации и передачи данных через HTTP-соединение.
XML
- труднее читать;
- более многословный;
- действует как язык разметки, а YAML как язык для форматирования данных;
- больше возможностей чем у YAML, например атрибуты тегов;
- более жёсткая схема документа.
Применение: XML идеален для сложных проектов, которым требуется тонкий контроль над валидацией, схемой и пространством имён. Язык обладает плохой читаемостью, требует большей пропускной способности и ёмкости хранилища, но обеспечивает беспрецедентный контроль.
Характерные особенности YAML
Поддержка мультидокументов
Вы можете объединить несколько YAML-документов в один YAML-файл для облегчения организации файлов и парсинга данных.
Документы разделяются тремя дефисами (—):
--- player: playerOne action: attack (miss) --- player: playerTwo action: attack (hit) ---
Поддержка комментариев
YAML позволяет добавлять комментарии после символа #, как в Python:
key: #Это однострочный комментарий - value line 5 #Это #многострочный комментарий - value line 13
Легко читаемый синтаксис
В синтаксисе YAML-файлов используется система отступов, как в Python. Необходимо использовать пробелы, а не табуляцию, чтобы избежать путаницы.
Это избавляет от лишних символов, которые есть в JSON и XML (кавычки, скобки, фигурные скобки).
В итоге читаемость файла значительно повышается.
YAML
#YAML Imaro: author: Charles R. Saunders language: English publication-year: 1981 pages: 224
JSON
Явная и неявная типизация
YAML предлагает как автоопределение типов, так и возможность явно указать тип данных. Чтобы использовать конкретный тип, нужно написать !![тип] перед значением.
# Это значение преобразуется в int: is-an-int: !!int 14.10 # Превращает любое значение в строку: is-a-str: !!str 67.43 # Значение должно быть boolean: is-a-bool: !!bool yes
Отсутствие исполняемых файлов
YAML не содержит исполняемых файлов. Поэтому можно безопасно обмениваться YAML-файлами с третьей стороной.
Чтобы использовать исполняемые файлы, YAML нужно интегрировать с другими языками, например Perl или Java.
Синтаксис YAML
В языке есть несколько базовых концепций, которые позволяют обрабатывать большинство данных.
Пары ключ-значение
Большинство данных в YAML-файле хранятся в виде пары ключ-значение, где ключ — это имя пары, а значение — связанные данные.
Скаляры и маппинг
Скаляр представляет собой одно значение, которому соответствует имя.
YAML поддерживает стандартные типы: int и float, boolean, string и null.
Они могут быть представлены в разных видах: шестнадцатеричном, восьмеричном или экспоненциальном. Также существуют специальные типы для математических сущностей, такие как: бесконечность, -бесконечность и NAN.
integer: 25 hex: 0x12d4 #равно 4820 octal: 023332 #равно 9946 float: 25.0 exponent: 12.3015e+05 #равно 1230150.0 boolean: Yes string: "25" infinity: .inf # преобразуется в бесконечность neginf: -.Inf #преобразуется в минус бесконечность not: .NAN #Not a Number null: ~
Строки
Строка — это коллекция символов, которая может содержать слово или предложение. Можно использовать либо |, для отдельных строк, либо >, для параграфов.
Кавычки в YAML не нужны.
str: Hello World data: | Это Отдельные Строки data: > Это один параграф текста
Последовательности
Последовательности — это структуры данных похожие на списки или массивы, которые хранят несколько значений под одним ключом. Они определяются с помощью отступов или [].
shopping: - milk - eggs - juice
Однострочные последовательности выглядят лаконичнее, но хуже читаются.
shopping: [milk, eggs, juice]
Словари
Словари — это коллекции пар ключ-значение, которые хранятся под одним ключом. Они позволяют разделить данные на логические категории.
Employees: - dan: name: Dan D. Veloper job: Developer team: DevOps - dora: name: Dora D. Veloper job: Project Manager team: Web Subscriptions
Словари могут содержать более сложные структуры, что позволяет хранить сложные реляционные данные.
Что ещё может YAML?
- Anchors (якоря)
- Templates (шаблоны)
- Взаимодействие с Docker, Ansible и т. д.
- Расширенные последовательности и маппинг.
- Расширенные типы данных (timestamp, null и т. д.)
Работа с файлами в формате YAML#
YAML (YAML Ain’t Markup Language) — еще один текстовый формат для записи данных.
YAML более приятен для восприятия человеком, чем JSON, поэтому его часто используют для описания сценариев в ПО. Например, в Ansible.
Синтаксис YAML#
Как и Python, YAML использует отступы для указания структуры документа. Но в YAML можно использовать только пробелы и нельзя использовать знаки табуляции.
Еще одна схожесть с Python: комментарии начинаются с символа # и продолжаются до конца строки.
Список#
Список может быть записан в одну строку:
[switchport mode access, switchport access vlan, switchport nonegotiate]
Или каждый элемент списка в своей строке:
- switchport mode access - switchport access vlan - switchport nonegotiate
Когда список записан таким блоком, каждая строка должна начинаться с — (минуса и пробела), и все строки в списке должны быть на одном уровне отступа.
Словарь#
Словарь также может быть записан в одну строку:
vlan: 100, name: IT >
vlan: 100 name: IT
Строки#
Строки в YAML не обязательно брать в кавычки. Это удобно, но иногда всё же следует использовать кавычки. Например, когда в строке используется какой-то специальный символ (специальный для YAML).
Такую строку, например, нужно взять в кавычки, чтобы она была корректно воспринята YAML:
command: "sh interface | include Queueing strategy:"
Комбинация элементов#
Словарь, в котором есть два ключа: access и trunk. Значения, которые соответствуют этим ключам — списки команд:
access: - switchport mode access - switchport access vlan - switchport nonegotiate - spanning-tree portfast - spanning-tree bpduguard enable trunk: - switchport trunk encapsulation dot1q - switchport mode trunk - switchport trunk native vlan 999 - switchport trunk allowed vlan
- BS: 1550 IT: 791 id: 11 name: Liverpool to_id: 1 to_name: LONDON - BS: 1510 IT: 793 id: 12 name: Bristol to_id: 1 to_name: LONDON - BS: 1650 IT: 892 id: 14 name: Coventry to_id: 2 to_name: Manchester
Модуль PyYAML#
Для работы с YAML в Python используется модуль PyYAML. Он не входит в стандартную библиотеку модулей, поэтому его нужно установить:
pip install pyyaml
Работа с ним аналогична модулям csv и json.
Чтение из YAML#
Попробуем преобразовать данные из файла YAML в объекты Python.
- BS: 1550 IT: 791 id: 11 name: Liverpool to_id: 1 to_name: LONDON - BS: 1510 IT: 793 id: 12 name: Bristol to_id: 1 to_name: LONDON - BS: 1650 IT: 892 id: 14 name: Coventry to_id: 2 to_name: Manchester
Чтение из YAML (файл yaml_read.py):
import yaml from pprint import pprint with open('info.yaml') as f: templates = yaml.safe_load(f) pprint(templates)
$ python yaml_read.py [, , ]
Формат YAML очень удобен для хранения различных параметров, особенно, если они заполняются вручную.
Запись в YAML#
Запись объектов Python в YAML (файл yaml_write.py):
import yaml to_yaml = 'access': ['switchport mode access', 'switchport access vlan', 'switchport nonegotiate', 'spanning-tree portfast', 'spanning-tree bpduguard enable'], 'trunk': ['switchport trunk encapsulation dot1q', 'switchport mode trunk', 'switchport trunk native vlan 999', 'switchport trunk allowed vlan'], > with open('sw_templates.yaml', 'w') as f: yaml.dump(to_yaml, f) with open('sw_templates.yaml') as f: print(f.read())
Файл sw_templates.yaml выглядит таким образом:
access: - switchport mode access - switchport access vlan - switchport nonegotiate - spanning-tree portfast - spanning-tree bpduguard enable trunk: - switchport trunk encapsulation dot1q - switchport mode trunk - switchport trunk native vlan 999 - switchport trunk allowed vlan
Конфигурационные файлы в Python
Конфиги. Все хранят их по разному. Кто-то в .yaml , кто-то в .ini , а кто-то вообще в исходном коде, подумав, что «Путь Django» с его settings.py действительно хорош.
В этой статье, я хочу попробовать найти идеальный (вероятнее всего) способ хранения и использования конфигурационных файлов в Python. Ну, а также поделиться своей библиотекой для них 🙂
Попытка №1
А что насчёт того чтобы хранить конфигурацию в коде? Ну, а что, вроде удобно, да и новых языков не придётся изучать. Существует множество проектов, в которых данный способ используется, и хочу сказать, вполне успешно.
Типичный конфиг в этом стиле выглядит так:
# settings.py TWITTER_USERNAME="johndoe" TWITTER_PASSWORD="johndoespassword" TWITTER_TOKEN=". "
Выглядит неплохо. Только одно настораживает, почему секьюрные данные хранятся в коде? Как мы это коммитить будем? Загадка. Разве что вносить наш файл в .gitignore , но это, конечно, вообще не решение.
Да и вообще, почему хоть какие-то данные хранятся в коде? Как мне кажется код, он на то и код, что должен выполнять какую-то логику, а не хранить данные.
Данный подход, на самом деле используется много где. В том же Django. Все думают, что раз это самый популярный фреймворк, который используется в самом Инстаграме, то они то уж плохое советовать не будут. Жаль, что это не так.
Попытка №2
Ладно, раз уж мы решили, что хранить данные в коде — не круто, то давайте искать альтернативу. Для конфигурационных файлов изобретено немалое количество различных форматов, в последнее время набирают большую популярность toml .
Но мы начнём с того, что нам предлагает сам Python — .ini . В стандартной библиотеке имеется библиотека configparser .
Наш конфиг, который мы уже писали ранее:
# settings.ini [Twitter] username="johndoe" password="johndoespassword" token=". "
А теперь прочитаем в Python:
import configparser # импортируем библиотеку config = configparser.ConfigParser() # создаём объекта парсера config.read("settings.ini") # читаем конфиг print(config["Twitter"]["username"]) # обращаемся как к обычному словарю! # 'johndoe'
Все проблемы решены. Данные хранятся не в коде, доступ прост. Но… а если нам нужно читать другие конфиги, ну там json или yaml например, или все сразу. Конечно, есть json в стандартной библиотеке и pyyaml , но придётся написать кучу (ну, или не совсем) кода для этого.
Попытка №3
А сейчас, я хотел бы показать Вам свою библиотеку, которая призвана решить все эти проблемы (ну, или хотя бы уменьшить ваши страдания :)).
Называется она betterconf и доступна на PyPi.
Установка так же проста, как и любой другой библиотеки:
pip install betterconf
Изначально, наш конфиг представлен в виде класса с полями:
# settings.py from betterconf import Config, field class TwitterConfig(Config): # объявляем класс, который наследуется от `Config` username = field("TWITTER_USERNAME", default="johndoe") # объявляем поле `username`, если оно не найдено, выставляем стандартное password = field("TWITTER_PASSWORD", default="johndoespassword") # аналогично token = field("TWITTER_TOKEN", default=lambda: raise RuntimeError("Account's token must be defined!") # делаем тоже самое, но при отсутствии токенавозбуждаем ошибку cfg = TwitterConfig() print(cfg.username) # 'johndoe'
По умолчанию, библиотека пытается взять значения из переменных окружения, но мы также можем настроить и это:
from betterconf import Config, field from betterconf.config import AbstractProvider import json class JSONProvider(AbstractProvider): # наследуемся от абстрактного класса SETTINGS_JSON_FILE = "settings.json" # путь до файла с настройками def __init__(self): with open(self.SETTINGS_JSON_FILE, "r") as f: self._settings = json.load(f) # открываем и читаем def get(self, name): return self._settings.get(name) # если значение есть - возвращаем его, иначе - None. Библиотека будет выбрасывать свою исключением, если получит None. provider = JSONProvider() class TwitterConfig(Config): username = field("twitter_username", provider=provider) # используем наш способ получения данных # . cfg = TwitterConfig() # .
Из этого примера следует, что мы можем применять различные провайдеры для получения данных. И это действительно иногда бывает удобно, говорю из личного опыта.
Хорошо, а что если у нас в конфигах есть булевые значения, или числа, они же в итоге будут все равно приходить в строках. И для этого есть решение:
from betterconf import Config, field # из коробки доступно всего 2 кастера from betterconf.caster import to_bool, to_int class TwitterConfig(Config): # . post_tweets = field("TWITTER_POST_TWEETS", caster=to_bool) # .
Таким образом, все похожие на булевые типы значения (а именно true и false будут преобразованы в питоновский bool . Регистр не учитывается.
Свой кастер написать также легко:
from betterconf.caster import AbstractCaster class DashToDotCaster(AbstractCaster): def cast(self, val): return val.replace("-", ".") # заменяет тире на точки to_dot = DashToDotCaster() # .
Итоги
Таким образом, мы пришли к выводу, что хранить настройки в исходных кодах — не есть хорошо. Для этого уже придуманы различные форматы. Ну, а вы познакомились с ещё одной полезной (как я считаю :)) библиотекой.
P.S
Да, также можно было включить и Pydantic , но я считаю, что он слишком НЕлегковесный для таких задач.
PyCharm: как её установить и использовать
Коротко и ясно о PyCharm — популярной IDE для программирования на Python.


Иллюстрация: Оля Ежак для Skillbox Media

Иван Стуков
Журналист, изучает Python. Любит разбираться в мелочах, общаться с людьми и понимать их.
Писать код можно даже в блокноте, и он будет работать. Однако гораздо удобнее делать это в специальной среде разработки, которая поможет программировать быстрее, проще и чище. Одна из них — PyCharm, которая создана для всех, кто пишет на языке Python.
- Что такое PyCharm
- Какие у неё системные требования
- Чем различаются версии Community и Pro
- Как установить PyCharm
- Как с ней работать
Что такое PyCharm
PyCharm — это интегрированная среда разработки на языке Python, созданная компанией JetBrains. Среди питонистов эта IDE вторая по популярности после редактора кода Visual Studio Code: как основную её используют 31% разработчиков.
В PyCharm есть все инструменты, чтобы писать, отлаживать и тестировать код. Например, можно быстро исправить программу сразу в нескольких местах, а встроенный форматер приведёт её в соответствие со стандартом PEP 8 .
Также IDE позволяет использовать в проектах другие языки программирования, синхронизировать код с системами контроля версий и развёртывать его.
Базовый набор функций PyCharm можно расширять с помощью плагинов, которые позволяют, например, настраивать внешний вид интерфейса и подключать дополнительные инструменты.
Системные требования PyCharm
Операционная система:
- Windows 8, 10 или 11 (64-битные версии);
- macOS 10.14 или более поздняя версия;
- Linux со средой GNOME, KDE или Unity DE; если дистрибутив не включает Glibc 2.14 или более позднюю версию (например, RHEL 6 или CentOS 6), то PyCharm может быть для него недоступен.
Процессор: никаких специальных требований нет, но рекомендуется, чтобы он был многоядерным, так как PyCharm поддерживает многопоточность. Это позволит выполнять операции быстрее.
Оперативная память: 4 ГБ свободной RAM. Рекомендуется, чтобы общая оперативная память у устройства была 8 ГБ.
Место на диске: 2,5 ГБ и ещё 1 ГБ для кэша. Рекомендуется использовать SSD и иметь хотя бы 5 ГБ свободного пространства.
Разрешение экрана: не менее 1024 × 768 пикселей, рекомендуется 1920 × 1080.
Версия Python:
- Python 2.7;
- Python 3.6 или более поздняя версия.
Чем различаются версии Community и Pro
У PyCharm есть две версии: бесплатная называется Community, а платная — Pro, или Professional.
Community подойдёт для тех, кто только изучает программирование или работает над небольшим проектом. Она предназначена для кодинга на чистом Python, хотя и поддерживает несколько дополнительных языков и форматов: Jython, HTML, XML, JSON, YAML, XSL, XPath и Markdown. Используя плагины, можно также установить Rust и Dart.
Professional умеет всё то же, что и Community, плюс кое-что ещё. Например:

- в бэкенде — поддерживает Cython и SQL;
- во фронтенде — работает с JavaScript, TypeScript, CSS, Sass, SCSS, Less. В качестве плагинов доступны Haml, Slim, Liquid.
Полноценная веб-разработка доступна только в редакции Pro; в ней есть поддержка веб-фреймворков:
- для Python: Django, Flask, Pyramid;
- для других языков: React, React Native, Angular, Node.js, Next.js, Vue.js.
К слову, в Community из фреймворков — только PyQt.
Ещё крупные различия:
- из инструментов сборки в Community есть Virtualenv/Buildout, в Pro — дополнительно NPM, Webpack, Gulp, Grunt, Vite;
- в Pro есть поддержка удалённых интерпретаторов: SSH, Docker, Docker Compose, WSL, Vagrant;
- в Community совместная разработка ограничена сеансами по 30 минут, в которых не больше трёх гостей, в Pro ограничений по времени нет, а гостей может быть вплоть до 50.
Подробнее различия между версиями можно посмотреть на сайте JetBrains. Ах да: если вас заинтересовала версия Pro, но вы ещё побаиваетесь её покупать, для неё есть бесплатный 30-дневный пробный период.
Как установить PyCharm
Скачать PyCharm можно двумя способами: напрямую с сайта разработчика или через Toolbox — приложение для управления инструментами от JetBrains.
Установка через Toolbox
JetBrains рекомендует использовать для управления своими продуктами именно Toolbox. Приложение позволяет быстро и из одного места устанавливать нужные инструменты, автоматически обновлять их сразу вместе с плагинами, откатываться до предыдущей версии и работать в нескольких версиях параллельно.
Toolbox будет особенно удобен, если вы пользуетесь сразу несколькими продуктами от JetBrains. Скачать приложение можно здесь.
Toolbox для Windows

- Скачать и запустить установщик в формате .exe.
- Следовать инструкциям установщика.
- Toolbox будет доступен по иконке на панели задач.
Toolbox для macOS
- Скачать образ диска в формате .dmg. Обратите внимание, что есть две версии файла: для процессоров Intel и Apple silicon.
- Смонтировать образ в системе и перетащить JetBrains Toolbox в папку «Приложения» (Applications).
Toolbox для Linux

- Скачать архив в формате .tar.gz.
- Распаковать его в директорию, которая поддерживает выполнение файлов.
- Запустить jetbrains-toolbox. После первого запуска в главном меню появится иконка , по которой Toolbox и будет доступен.
После запуска Toolbox любую редакцию PyCharm в любой версии можно скачать и запустить прямо из приложения.

Автономная установка
Скачать PyCharm можно и отдельно, без использования дополнительных приложений. Чтобы пощупать PyCharm для себя, сначала можно скачать Community Edition. Версия Pro доступна по той же ссылке.
Для Windows
- Скачать установщик в формате .exe. Их есть два вида: для компьютеров с процессором ARM64 и для всех остальных.
- После загрузки файла открывается страница с благодарностью. На ней можно загрузить контрольную сумму SHA, чтобы проверить целостность установщика.
- Запустить установщик, следовать его инструкциям, выбрать нужные параметры.
Для macOS
- Скачать образ диска в формате .dmg. Их два вида: для процессоров Intel и Apple silicon.
- После загрузки файла открывается страница с благодарностью. На ней можно загрузить контрольную сумму SHA, чтобы проверить целостность образа диска.
- Смонтировать образ в системе и перетащить PyCharm в папку «Приложения» (Applications).
Для Linux
- Скачать архив в формате .tar.gz. Их два вида: для компьютеров с процессором ARM64 и для всех остальных.
- После загрузки файла открывается страница с благодарностью. На ней можно загрузить контрольную сумму SHA, чтобы проверить целостность архива.
- Распаковать скачанный файл. Если нынешняя директория «Загрузки» (Downloads) не поддерживает выполнение файла, то распакуйте его в другую. Сделать это можно с помощью команды:
tar xzf pycharm-*.tar.gz -C
Вместо звёздочки нужно указать версию PyCharm, вместо — директорию. Производитель рекомендует использовать директорию /opt. Например:
Как использовать PyCharm: пишем первую программу
Напишем и запустим программу, которая будет выводить «Hello, world!». Для этого откроем PyCharm и создадим новый проект, нажав New Project.

Откроется страница с настройками проекта. Здесь выберем местоположение и виртуальную среду (в нашем случае это virtualenv, но можно и любую другую).
Также уберём флажок с пункта Create a main.py welcome script. Если его оставить, то при создании проекта PyCharm автоматически создаст файл main.py с примером кода.

Нажмём на кнопку Create и создадим проект, после чего он сразу же откроется.

Создадим Python-файл, в котором напишем свой код. Для этого в окне Project правой кнопкой мыши нажмём на корневую папку HelloWorld. Во всплывающем окне выберем New → Python File.

Откроется окно, в котором введём название файла. Назовём его hello или любым другим именем, нажмём Enter.

PyCharm создаст файл, в котором и напишем наш код.

Вот мы и написали свою первую программу в PyCharm. Вы могли обратить внимание, что даже в ней PyCharm подсказывал и помогал:
- автоматически выставлял отступы;
- подсвечивал ошибки (например, если забыли поставить двоеточие в конце первой строки);
- при написании функции print предложил автодополнение уже после первых двух букв;
- проверял код на соответствие стандарту PEP 8.
Подробнее о том, как работать в PyCharm, можно прочитать в её документации.
Что в итоге
- PyCharm — популярная среда разработки, заточенная под потребности Python-разработчиков. Она упрощает и ускоряет работу с кодом, помогает избегать багов и писать более чисто.
- PyCharm существует в двух редакциях: Community и Professional. Community бесплатна, а Professional даёт обширный набор инструментов.
- Community Edition будет достаточно для обучения программированию и небольших личных проектов, написанных на чистом Python.
- Professional Edition подойдёт для крупных проектов, научной и веб-разработки.
А вообще, опытные разработчики и хакеры рекомендуют программировать в Vim. Это бесплатный редактор кода, который можно превратить в полноценную IDE с кучей полезных функций. В прошлом году у нас как раз вышел бесплатный курс по нему.
Читайте также:
- 8 типов программ, которые упрощают жизнь разработчиков
- «Прошёл модуль курса и начал рассылать резюме»: музыкант, который стал питонистом
- Как установить библиотеку в Python: руководство для новичка
Руководство по стилю написания кода, принятое среди Python-разработчиков.