Задать вопрос
@Boris19

Как вынести алиасы в другой файл?

У Yaml есть поддержка алиасов
Т.е. например:
references:
    value1: &reference "Don't repeat yourself!"  
    value2: *reference

Т.е. можно указывать ссылку на элемент. Но вот проблема, хочется вынести эти алиасы в отдельный файл, чтобы можно было сразу для нескольких yaml файлов, указывать все алиасы по дефолту.
Готовых решений не нашел, пытался свой костыль сделать с подгрузкой файла через добавление конструктора (Loader.add_constructor), но похоже что ссылки подменяются раньше, т.к. до конструктора выполнение не доходило и выпадало с ошибкой found undefined alias

Может кто сталкивался с таким и нашел решение, подсобите, пожалуйста!
  • Вопрос задан
  • 257 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Спецификация YAML не поддерживает каких-либо отношений между документами. Более того, она явно постулирует, что каждый документ независим. Но есть библиотеки это игнорирующие.
import sys
from ruamel.std.pathlib import Path
from ruamel.yaml import YAML, version_info

yaml = YAML(typ='safe', pure=True)
yaml.default_flow_style = False

def my_compose_document(self):
    self.parser.get_event()
    node = self.compose_node(None, None)
    self.parser.get_event()
    return node

yaml.Composer.compose_document = my_compose_document

def yaml_include(loader, node):
    y = loader.loader
    yaml = YAML(typ=y.typ, pure=y.pure)
    yaml.composer.anchors = loader.composer.anchors
    return yaml.load(Path(node.value))

yaml.Constructor.add_constructor("!include", yaml_include)

data = yaml.load(Path('warehouse.yaml'))
yaml.dump(data, sys.stdout)

specific.yaml
specific:
  spec1:
    <<: *obj1
  spec2:
    <<: *obj1
    key1: 10

warehouse.yaml
warehouse:
  obj1: &obj1
    key1: 1
    key2: 2
specific: !include specific.yaml
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
AST Москва
До 350 000 ₽
21 янв. 2025, в 03:52
100000 руб./за проект
21 янв. 2025, в 03:49
100000 руб./за проект