Переопределить подраздел YAML - PullRequest
13 голосов
/ 02 февраля 2011

скажем, у меня есть следующий файл 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'] изменилось? Или я должен использовать серию якорей на каждом уровне?

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

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

1 Ответ

9 голосов
/ 08 мая 2012

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

При чтении spec (версия 1.2, но 1.1 говорит то же самое), раздел 7.1 Узлы псевдонимов заявляет (выделено мое):

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

Узел псевдонима обозначается индикатором «*». Псевдоним относится к самому последнему предыдущему узлу, имеющему такую ​​же привязку. Для узла псевдонима является ошибкой использование привязки, которая ранее не встречалась в документе. Не является ошибкой указание привязки, которая не используется ни одним узлом псевдонима.

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

Два очка здесь:

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

  2. Если псевдоним не может иметь никакого содержимого (второй раздел, выделенный жирным шрифтом), вы не можете указать переопределение способом, предложенным в вопросе.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...