2013-03-05 7 views
21

मुझे कुछ स्तर पर मिलता है, लेकिन मुझे अभी तक ऐसा कोई उदाहरण नहीं दिख रहा है जो उत्तर से अधिक प्रश्न नहीं उठाता है।मुझे समझ में नहीं आता कि कोई वाईएएमएल टैग

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

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

मुझे लगता है कि हम एक सेट टैग घोषणा कर रहे मिलता है। मुझे यह नहीं मिलता है कि बाद में हैश मैपिंग के साथ क्या करना है। क्या हम एक स्कीमा घोषित कर रहे हैं? क्या कोई मुझे कई टैग घोषणाओं के साथ एक उदाहरण दिखा सकता है? http://yaml.org/spec/1.2/spec.html#id2761292

%TAG ! tag:clarkevans.com,2002: 

यह एक स्कीमा की घोषणा है:

मैं कल्पना के माध्यम से पढ़ा है? फाइल को सफलतापूर्वक पार्स करने के लिए क्या कोई और पार्सर करना है? कुछ प्रकार की एक स्कीमा फ़ाइल?

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

क्यों यह एक प्राथमिक और माध्यमिक टैग है के लिए प्रासंगिक है, और क्यों एक माध्यमिक टैग यूआरआई का उल्लेख करता है? इन्हें हल करके क्या समस्या हल हो रही है?

मुझे लगता है कि "वे क्या हैं", और "वे वहां क्यों हैं", या "उनके लिए क्या उपयोग किया जाता है"।

+2

में उपलब्ध है, '# सेट:

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

यहां एक संपूर्ण अजगर PyYaml प्रदर्शन टैग उपयोग का उपयोग कर कार्यक्रम है। नया ([1,2])। to_yaml' वास्तव में एक * टिप्पणी * है - यह एक रूबी स्टेटमेंट है जो इसके नीचे वाईएएमएल आउटपुट करेगा। – AlexFoxGill

उत्तर

13

मैं YAML बारे में बहुत कुछ पता नहीं लेकिन मैं इसे एक शॉट दे देंगे:

टैग प्रकार निरूपित करने के लिए उपयोग किया जाता है। एक टैग को ! का उपयोग करके घोषित किया गया है जैसा आपने वहां "रेफकार्ड" से देखा है। %TAG निर्देश एक टैग के लिए शॉर्टकट घोषित करने जैसा है।

मैं पाययामल के साथ प्रदर्शन करूंगा। PyYaml !!python/object: के माध्यमिक टैग को वास्तविक पायथन ऑब्जेक्ट के रूप में पार्स कर सकता है। डबल विस्मयादिबोधक चिह्न स्वयं में एक प्रतिस्थापन है, !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 

नोड्स उनके डिफ़ॉल्ट प्रकार से पार्स कर रहे हैं यदि आप कोई टैग एनोटेशन हैं । अनुसरण कर रहे हैं बराबर:

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

संबंधित मुद्दे