2013-03-05 18 views
21

私はあるレベルでそれを手に入れていますが、答えよりも多くの質問を出さない例はまだありません。YAMLのタグが何であるのか分かりません

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

なぜそれがプライマリとセカンダリのタグを持つことが適切である、そしてなぜ二タグはURIを参照していますか?これらを持つことで、どんな問題が解決されていますか?

私は「彼らが何であるか」、「なぜ彼らはそこにいるのか」、「彼らは何のために使用されているのか」を多く見かけます。

+2

で利用可能です。 new([1,2])。to_yaml'は実際には* comment *です - その下にYAMLを出力するのはruby文です。 – AlexFoxGill

答えて

13

私はYAMLについて多くを知らないが、私はそれに打撃を与えるだろう:

タグの種類を示すために使用されています。タグは!を使用して宣言されています。 %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" 

は、タグの使用を実証PyYAMLとを使用して完全なPythonプログラムである:

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

関連する問題