Подтвердить что ты не робот

Использовать заполнители в ямле

Есть ли способ использовать заполнители в yaml, например:

foo: &FOO
    <<propname>>: 
        type: number 
        default: <<default>>

bar:
    - *FOO 
       propname: "some_prop"
       default: "some default" 
4b9b3361

Ответ 1

Контекст

  • YAML версия 1.2
  • пользователь желает
    • включать переменные заполнители в YAML
    • заменить заполнители на вычисленные значения при yaml.load
    • иметь возможность использовать заполнители для ключей и значений сопоставления YAML

Проблема

  • YAML изначально не поддерживает переменные заполнители
  • Якоря и псевдонимы допускают некоторый уровень абстракции и косвенности, но они не работают как переменные заполнители, которые могут быть вставлены в произвольные области по всему тексту YAML. Они должны быть размещены как отдельные узлы YAML
  • Существуют некоторые дополнительные библиотеки, которые поддерживают произвольные переменные-заполнители, но они не являются частью собственной спецификации YAML

Пример

Рассмотрим следующий пример YAML. Это правильно сформированный синтаксис YAML, однако он использует (нестандартные) фигурные скобки со встроенными выражениями.

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

part01_customer_info:
  cust_fname:   "Homer"
  cust_lname:   "Himpson"
  cust_motto:   "I love donuts!"
  cust_email:   [email protected]

part01_government_info:
  govt_sales_taxrate: 1.15

part01_purchase_info:
  prch_unit_label:    "Bacon-Wrapped Fancy Glazed Donut"
  prch_unit_price:    3.00
  prch_unit_quant:    7
  prch_product_cost:  "{{prch_unit_price * prch_unit_quant}}"
  prch_total_cost:    "{{prch_product_cost * govt_sales_taxrate}}"

part02_shipping_info:
  cust_fname:   "{{cust_fname}}"
  cust_lname:   "{{cust_lname}}"
  ship_city:    Houston
  ship_state:   Hexas

part03_email_info:
  cust_email:     "{{cust_email}}"
  mail_subject:   Thanks for your DoughNutz order!
  mail_notes: |
    We want the mail_greeting to have all the expected values
    with filled-in placeholders (and not curly-braces).
  mail_greeting: |
    Greetings {{cust_fname}} {{cust_lname}}!

    We love your motto "{{cust_motto}}" and we agree with you!

    Your total purchase price is {{prch_total_cost}}

    Thank you for your order!

Объяснение

  • Замены, помеченные ЗЕЛЕНЫМ, легко доступны в стандартном YAML с использованием якорей, псевдонимов и ключей слияния.

  • Заметки, отмеченные ЖЕЛТЫМ, технически доступны в стандартном YAML, но не без объявления пользовательских типов или какого-либо другого механизма связывания.

  • Замены, отмеченные КРАСНЫМ, недоступны в стандартном YAML. Тем не менее, есть обходные пути и альтернативы; например, через форматирование строк или механизмы шаблонов строк (например, python str.format).

Image explaining the different types of variable substitution in YAML

Подробнее

Часто запрашиваемая функция для YAML - это возможность вставлять произвольные переменные заполнители, которые поддерживают произвольные перекрестные ссылки и выражения, которые относятся к другому контенту в том же (или транскрипционном) файле (ах) YAML.

YAML поддерживает привязки и псевдонимы, но эта функция не поддерживает произвольное размещение заполнителей и выражений где-либо в тексте YAML. Они работают только с узлами YAML.

YAML также поддерживает декларации пользовательских типов, однако они встречаются реже и имеют последствия для безопасности, если вы принимаете контент YAML из потенциально ненадежных источников.

Дополнительные библиотеки YAML

Существуют библиотеки расширений YAML, но они не являются частью собственной спецификации YAML.

обходные

  • Используйте YAML в сочетании с системой шаблонов, такой как Jinja2 или Twig
  • Использовать библиотеку расширений YAML
  • Используйте функциональность в стиле sprintf или str.format на языке хостинга

Альтернативы

  • Jsonnet имеет некоторое сходство с YAML, но с дополнительными функциями, которые могут быть ближе к цели, указанной в OP.

Смотрите также