Python:
Робота з YAML

Як це зробити:

Читання та запис у форматі YAML у Python зазвичай вимагає використання сторонньої бібліотеки, серед яких PyYAML є найпопулярнішою. Щоб розпочати, потрібно встановити PyYAML, виконавши pip install PyYAML.

Приклад: Запис у файл YAML

import yaml

data = {'список': [1, 42, 3.141, 1337, 'допомога', u'€'],
        'рядок': 'бух!',
        'ще один словник': {'фу': 'бар', 'ключ': 'значення', 'відповідь': 42}}

with open('example.yaml', 'w') as f:
    yaml.dump(data, f, default_flow_style=False)

# Це створює `example.yaml` з даними, структурованими у форматі YAML.

Приклад: Читання з файлу YAML

import yaml

with open('example.yaml', 'r') as f:
    data_loaded = yaml.safe_load(f)

print(data_loaded)

# Вивід: 
# {'список': [1, 42, 3.141, 1337, 'допомога', '€'],
#  'рядок': 'бух!',
#  'ще один словник': {'фу': 'бар', 'ключ': 'значення', 'відповідь': 42}}

Використання YAML для конфігурації

Багато програмістів використовують YAML для управління конфігураціями програм. Ось приклад, як можна структурувати конфігураційний файл та прочитати його:

config.yaml:

database:
  host: localhost
  port: 5432
  username: admin
  password: secret

Читання конфігураційного файлу в Python:

import yaml

with open('config.yaml', 'r') as f:
    config = yaml.safe_load(f)

print(config['database']['host'])  # Вивід: localhost

Обробка складних структур

Для обробки складних структур PyYAML дозволяє визначати користувацькі об’єкти Python. Проте, з метою забезпечення безпеки, використовуйте safe_load, щоб уникнути виконання довільних функцій або об’єктів.

import yaml

# Визначення об'єкта Python
class Example:
    def __init__(self, value):
        self.value = value

# Користувацький конструктор
def constructor_example(loader, node):
    value = loader.construct_scalar(node)
    return Example(value)

# Додавання конструктора для тега "!example"
yaml.add_constructor('!example', constructor_example)

yaml_str = "!example 'дані'"
loaded = yaml.load(yaml_str, Loader=yaml.FullLoader)

print(loaded.value)  # Вивід: дані

У цьому фрагменті !example є користувацьким тегом, який використовується для інстанціювання об’єкта Example зі значенням ‘дані’ з рядка YAML. Такі користувацькі завантажувачі, як цей, підвищують гнучкість PyYAML, дозволяючи обробляти більш складні структури даних та типи.