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

Переопределить подраздел YAML

Скажем, у меня есть следующий файл YAML:

-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: value
-
   key1: value
# and so on...
   key99: value
   key100:
      subkey1: value
# and so on...
      subkey100: SOME DIFFERENT VALUE

Естественный способ обработки большого количества идентичных данных будет состоять из якорей и переопределения только измененного ключа.

Вопрос в том, что здесь подразделение отличается. Есть ли простой способ просто указать, что key100['subkey100'] изменено? Или мне нужно использовать ряд привязок на каждом уровне?

I.e., есть сокращение для:

- &anchor
   key1: value
# and so on...
   key99: value
   key100: &subanchor
      subkey1: value
# and so on...
      subkey100: value
-
   <<: *anchor
   key100:
      <<: *subanchor
      subkey100: SOME DIFFERENT VALUE
4b9b3361

Ответ 1

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

При чтении spec (версия 1.2, но 1.1 говорит то же самое), раздел 7.1 Alias ​​Nodes указывает (основное внимание):

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

Алиас node обозначается индикатором "*". Псевдоним ссылается на предыдущий предыдущий node, имеющий тот же якорь. Ошибка для псевдонима node для использования якоря, который ранее не встречался в документе. Не является ошибкой указывать якорь, который не используется никаким псевдонимом node.

Обратите внимание, что псевдоним node не должен указывать какие-либо свойства или содержимое, поскольку они уже указывались при первом входе node.

Два пункта:

  • "Ранее сериализованный node" - эта формулировка предполагает, что псевдоним предназначен для представления другого вхождения исходного node, а не только данных в оригинале node. Другими словами, он представляет один и тот же объект, а не копию.

  • Если псевдоним не может содержать какой-либо контент (вторая жирная секция), вы не можете указать переопределение в моде, предложенном в вопросе.

Итак, моя интерпретация спецификации заключается в том, что вы не можете сделать это в соответствии со спецификацией.

Однако - если вы вставляете пример (второй блок кода) из оригинала в этот онлайн-инструмент (вы можете снять флажок "canonical" ), этот инструмент интерпретирует он как и предполагалось в этом вопросе, копирует исходное содержимое, но переопределяет subkey100. То же самое для этого YAML Lint Tool, как и этот онлайн-парсер.

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