2013-03-05 43 views
21

Bir düzeyde anladım, ancak henüz yanıtlardan daha fazla soru sormayan bir örnek görmedim.YAML etiketinin ne anlama geldiğini anlamıyorum

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

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

Sanırım bir ayarla etiketi ilan olduğunuzu olsun. Sonraki karma haritasının bununla ne ilgisi olduğunu anlamıyorum. Şema mı ilan ediyoruz? Birisi bana çoklu etiket bildirimleriyle örnek gösterebilir mi? http://yaml.org/spec/1.2/spec.html#id2761292

%TAG ! tag:clarkevans.com,2002: 

bu bir şemayı ilan mı:

Ben spec baştan sona kadar okuduktan? Dosyayı başarıyla ayrıştırmak için ayrıştırıcının yapması gereken başka bir şey var mı? Bir tür şema dosyası mı?

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

Neden birincil ve ikincil etiketine sahip alakalı olduğunu ve ikincil etiket bir URI neden belirtmektedir? Bunlara sahip olmakla hangi sorun çözülüyor?

Bir sürü "ne var" görüyorum ve "neden oradalar", ya da "ne için kullanılıyorlar" gibi görünüyor.

+2

mevcuttur, '# Set: Burada

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

PyYAML gösteren etiket kullanımını kullanarak tam bir Python programıdır. yeni ([1,2]). to_yaml' aslında bir * comment * - YAML'yi aşağıya çıkaracak bir yakut ifadesidir. – AlexFoxGill

cevap

13

Ben YAML hakkında çok şey bilmiyorum ama ben bir vuruş vereceğiz:

Etiketler türlerini belirtmek için kullanılır. ! kullanılarak bir etiket burada "refcard" dan görüldüğü gibi bildirilmiştir. %TAG yönergesi, bir etikete kısayol bildirmek gibidir.

PyYaml ile göstereceğim. PyYaml, !!python/object:'un ikincil etiketini gerçek bir python nesnesi olarak ayrıştırabilir. Çiftli ünlem işareti, tüm ifadeyi !tag:yaml.org,2002:python/object:'a dönüştüren !tag:yaml.org,2002: için kısa bir kendi içinde bir ikame. Bu ifade biz bir nesne oluşturmak istediğiniz her zaman dışarı yazarak için biraz hantal, bu yüzden biz %TAG yönergesini kullanarak bir takma ad vermek:

%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 
hiçbir etiket açıklamaları varsa

Düğümler varsayılan türüne göre çözümlenir . Aşağıdakiler eşdeğeri:

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) 

fazla bilgi İlk örnekte spec