2013-03-05 33 views
21

Dostaję go na pewnym poziomie, ale nie widziałem jeszcze przykładu, który nie przyniósłby więcej pytań niż odpowiedzi.Nie rozumiem, co znacznik YAML jest

http://rhnh.net/2011/01/31/yaml-tutorial

# Set.new([1,2]).to_yaml 
--- !ruby/object:Set 
hash: 
    1: true 
    2: true 

otrzymuję że jesteśmy deklarowania zestaw znaczników. Nie rozumiem, co ma z tym wspólnego późniejsze mapowanie hash. Czy deklarujemy schemat? Czy ktoś może pokazać mi przykład z wieloma deklaracjami znaczników?

Czytałem przez spec: http://yaml.org/spec/1.2/spec.html#id2761292

%TAG ! tag:clarkevans.com,2002: 

Czy to deklarując schematu? Czy jest coś innego, co parser musi zrobić, aby pomyślnie przeanalizować plik? Jakiś plik schematu?

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"). 

Dlaczego jest to istotne, aby mieć tag pierwotnego i wtórnego, i dlaczego tag wtórna odnosi się do URI? Jaki problem rozwiązuje się poprzez ich posiadanie?

Wydaje mi się, że widzę "kim są" i "dlaczego oni tam są" lub "do czego są wykorzystywane".

+2

W swoim pierwszym przykładzie '# Ustaw. new ([1,2]) to_yaml' jest właściwie * komentarzem * - jest to instrukcja ruby, która wyświetli YAML poniżej. – AlexFoxGill

Odpowiedz

13

Nie wiem wiele o YAML ale dam mu szansę:

Tagi są używane do oznaczenia typów. Znacznik jest zadeklarowany za pomocą !, jak widzieliście z "karty" tam. Dyrektywa %TAG jest trochę jak deklarowanie skrótu do tagu.

Demonstruję z PyYaml. PyYaml może analizować dodatkowy znacznik !!python/object: jako rzeczywisty obiekt python. Podwójny wykrzyknik jest sam w sobie podstawnikiem, skrótem od !tag:yaml.org,2002:, co zamienia całe wyrażenie na !tag:yaml.org,2002:python/object:. Wyrażenie to jest trochę nieporęczny do wpisywania za każdym razem chcemy stworzyć obiekt, więc dajemy mu alias za pomocą dyrektywy %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 

Węzły są analizowane przez ich domyślnego typu, jeżeli nie masz adnotacje znaczników . Poniższy są równoważne:

- 1: Alex 
- !!int "1": !!str "Alex" 

Oto kompletny program Python przy użyciu PyYaml wykazujący użycie tagu:

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) 

Więcej informacji dostępnych jest w spec