2013-03-05 21 views
21

Tôi nhận được nó ở một mức độ nào đó, nhưng tôi vẫn chưa thấy một ví dụ không mang lại nhiều câu hỏi hơn câu trả lời.Tôi không hiểu một thẻ YAML là gì

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

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

Tôi nhận được rằng chúng ta đang tuyên bố một thẻ Set. Tôi không hiểu bản đồ băm tiếp theo phải làm gì với nó. Chúng ta đang khai báo một lược đồ? Ai đó có thể cho tôi xem một ví dụ có nhiều khai báo thẻ không?

Tôi đã đọc qua spec: http://yaml.org/spec/1.2/spec.html#id2761292

%TAG ! tag:clarkevans.com,2002: 

Đây có phải là tuyên bố một lược đồ? Có điều gì khác mà một trình phân tích cú pháp phải làm để phân tích cú pháp tệp thành công không? Một tệp lược đồ của một số loại?

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

Tại sao nó có liên quan để có một thẻ chính và phụ, và tại sao thẻ thứ cấp tham khảo một URI? Vấn đề gì đang được giải quyết bằng cách có những thứ này?

Tôi dường như thấy rất nhiều "chúng là gì" và không "tại sao chúng ở đó" hoặc "chúng được sử dụng để làm gì".

+2

Trong ví dụ đầu tiên của bạn, '# Set. new ([1,2]). to_yaml' thực ra là một chú thích * - đó là một câu lệnh ruby ​​có thể xuất ra YAML bên dưới nó. – AlexFoxGill

Trả lời

13

Tôi không biết nhiều về YAML nhưng tôi sẽ cung cấp cho nó một shot:

Thẻ được sử dụng để biểu thị các loại. Thẻ được khai báo sử dụng ! như bạn đã thấy từ "thẻ đại diện" ở đó. Chỉ thị %TAG giống như tuyên bố lối tắt cho thẻ.

Tôi sẽ chứng minh bằng PyYaml. PyYaml có thể phân tích cú pháp thẻ phụ của !!python/object: làm đối tượng python thực tế. Dấu chấm than đôi là một thay thế trong chính nó, viết tắt của !tag:yaml.org,2002:, biến toàn bộ biểu thức thành !tag:yaml.org,2002:python/object:. Biểu thức này là một chút khó sử dụng được gõ ra mỗi lần chúng tôi muốn tạo ra một đối tượng, vì vậy chúng tôi cung cấp cho nó một bí danh bằng cách sử dụng %TAG chỉ:

%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 

Nodes được phân tích theo loại mặc định của họ nếu bạn không có chú thích tag . Sau đây là tương đương:

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

Đây là một chương trình đầy đủ Python sử dụng PyYaml chứng minh việc sử dụng thẻ:

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) 

Thông tin chi tiết có sẵn trong spec

Các vấn đề liên quan