home rss

Python + YAML

Зачем это, собственно?

Для конфигов. Писать конфиги на питоне и импортить, на мой взгляд, лучший вариант. Но это не всегда удобно. Типичный пример: нужно загрузить конфиг из родительской папки. Вариант решения - не импортить, хранить в текстовом формате, читать и парсить. Конечно, хочется парсить автоматом. Да ещё, чтобы сам конфиг был читабельным. Варианты:

По сути yaml - это расширение json. Или json подмножество yaml :)

Как это работает

Для начала ставим пакет:

pip install pyyaml

А дальше всё стандартно:

>>> import yaml
>>> yaml.load('[1, a, false]')  # парсим yaml-строку
[1, 'a', False]
>>> yaml.dump([2, 'b', None])  # дампим в yaml-строку
'[2, b, null]\n'

Можно парсить данные прямо из файла:

cfg = yaml.load(open('test.yaml'))

Например, из такого файла test.yaml:

# Простые типы, а это камент, кстати :)
word: Строка    # без кавычек удобно
num: 2009       # число
none: null      # None
bool: true      # Bool

# Список одной строкой
lst1: [буквы, 123, null]

# Многострочный вариант списка
lst2:
    - буквы   # тут возможны каменты
    # и тут тоже
    - 123
    - null

# Словарь в одну строку
dic1: {word : буквы, num : 123, none : null}

# Многострочный словарь
dic2:
    word: буквы
    num: 123
    none: null

# Длинная строка, переносы удаляются
big_str1: >
    Тру
    лю
    лю

# Длинная строка, переносы сохраняются
big_str2: |
    Тра
    ля
    ля

# Вложенности
langs:
    - XML:
        читабельность: никакая
        использование: мерзкие парсеры
        назначение: обмен данными
    - YAML:
        читабельность: высокая
        использование: святая простота
        назначение: конфиги

Получится такая структура данных:

{
    'word' : u'Строка',
    'num'  : 2009,
    'none' : None,
    'bool' : True,

    'lst1' : [u'Строка', 123, None],
    'lst2' : [u'Строка', 123, None],

    'dic1' : {'none' : None, 'num': 123, 'word' : u'буквы'},
    'dic2' : {'none' : None, 'num': 123, 'word' : u'буквы'},

    'big_str1' : u'Тра ля ля\n',
    'big_str2' : u'Тру\nля\nля\n',

    'langs': {
        'XML': {
            u'читабельность' : u'никакая',
            u'использование' : u'мерзкие парсеры',
            u'назначение'    : u'обмен данными',
        },
        'YAML': {
            u'читабельность' : u'высокая',
            u'использование' : u'святая простота',
            u'назначение'    : u'конфиги',
        }
    },
}
22.12.2009