tags - keywords - No entiendo que es una etiqueta YAML
meta tags google (1)
No sé mucho sobre YAML pero le daré una oportunidad:
Las etiquetas se utilizan para denotar tipos. Se declara una etiqueta usando !
Como has visto en el "refcard" de allí. La directiva %TAG
es como declarar un acceso directo a una etiqueta.
Voy a demostrar con PyYaml. PyYaml puede analizar la etiqueta secundaria de !!python/object:
como un objeto de python real. El signo de exclamación doble es una sustitución en sí misma, abreviatura de !tag:yaml.org,2002:
que convierte la expresión completa en !tag:yaml.org,2002:python/object:
Esta expresión es un poco difícil de manejar cada vez que queremos crear un objeto, así que le damos un alias usando la directiva %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
Los nodos se analizan por su tipo predeterminado si no tiene anotaciones de etiqueta. Los siguientes son equivalentes:
- 1: Alex
- !!int "1": !!str "Alex"
Aquí hay un programa completo de Python que usa PyYaml demostrando el uso de la etiqueta:
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)
Más información está disponible en la spec
Lo obtengo en algún nivel, pero aún no he visto un ejemplo que no haya generado más preguntas que respuestas.
http://rhnh.net/2011/01/31/yaml-tutorial
# Set.new([1,2]).to_yaml
--- !ruby/object:Set
hash:
1: true
2: true
Entiendo que estamos declarando una etiqueta Set. No entiendo qué tiene que ver el mapeo hash posterior con eso. ¿Estamos declarando un esquema? ¿Puede alguien mostrarme un ejemplo con múltiples declaraciones de etiquetas?
He leído la especificación: http://yaml.org/spec/1.2/spec.html#id2761292
%TAG ! tag:clarkevans.com,2002:
¿Esto es declarar un esquema? ¿Hay algo más que un analizador tiene que hacer para analizar correctamente el archivo? ¿Un archivo de esquema de algún tipo?
http://www.yaml.org/refcard.html
Tag property: # Usually unspecified.
none : Unspecified tag (automatically resolved by application).
''!'' : Non-specific tag (by default, "!!map"/"!!seq"/"!!str").
''!foo'' : Primary (by convention, means a local "!foo" tag).
''!!foo'' : Secondary (by convention, means "tag:yaml.org,2002:foo").
''!h!foo'': Requires "%TAG !h! <prefix>" (and then means "<prefix>foo").
''!<foo>'': Verbatim tag (always means "foo").
¿Por qué es relevante tener una etiqueta primaria y secundaria, y por qué una etiqueta secundaria se refiere a un URI? ¿Qué problema se está resolviendo al tener estos?
Parece que veo un montón de "lo que son", y no "por qué están allí" o "para qué se usan".