Ответ 1
Я ничего не знаю о YAML, но я дам ему выстрел:
Тэги используются для обозначения типов. Тег объявляется с помощью !
, как вы видели из "refcard". Директива %TAG
похожа на объявление ярлыка для тега.
Я продемонстрирую с PyYaml. PyYaml может анализировать вторичный тег !!python/object:
как действительный объект python. Двойной восклицательный знак - это сама по себе замена, сокращенная для !tag:yaml.org,2002:
, которая превращает все выражение в !tag:yaml.org,2002:python/object:
. Это выражение немного неудобно печатать каждый раз, когда мы хотим создать объект, поэтому мы даем ему псевдоним, используя директиву %TAG
:
%TAG !py! tag:yaml.org,2002:python/object: # declares the tag alias
---
- !py!__main__.MyClass # creates an instance of MyClass
- !!python/object:__main__.MyClass # equivalent with no alias
- !<tag:yaml.org,2002:python/object:__main__.MyClass> # equivalent using primary tag
Узлы анализируются по типу по умолчанию, если у вас нет аннотаций тегов. Следующие эквиваленты:
- 1: Alex
- !!int "1": !!str "Alex"
Вот полная программа Python с использованием PyYaml, демонстрирующая использование тегов:
import yaml
class Entity:
def __init__(self, idNum, components):
self.id = idNum
self.components = components
def __repr__(self):
return "%s(id=%r, components=%r)" % (
self.__class__.__name__, self.id, self.components)
class Component:
def __init__(self, name):
self.name = name
def __repr__(self):
return "%s(name=%r)" % (
self.__class__.__name__, self.name)
text = """
%TAG !py! tag:yaml.org,2002:python/object:__main__.
---
- !py!Component &transform
name: Transform
- !!python/object:__main__.Component &render
name: Render
- !<tag:yaml.org,2002:python/object:__main__.Entity>
id: 123
components: [*transform, *render]
- !<tag:yaml.org,2002:int> "3"
"""
result = yaml.load(text)
Дополнительная информация доступна в spec