簡體   English   中英

解析 ruamel.yaml 中的多個自定義標簽

[英]parse multiple custom tags in ruamel.yaml

背景:在我的計算機視覺程序中,用戶正在修改 YAML 文件以提供注釋函數(列表項是函數,標量序列是參數)。 工作流程是open/modify YAML file > save yaml > parse and execute functions > show results, and start over or save 在一個文件中可以有同一工具的多個實例,通過“id”標量進行區分。 由於注釋在每次迭代后都會保存,因此還需要控制覆蓋行為,這也是用標量控制的。

- create_annotation: 
  id: my_id1
  overwrite: false
  tool: mask
- create_annotation: 
  id: my_id2
  overwrite: true
  tool: mask

問題我想開始使用一些自定義 YAML 標記將實例/覆蓋語句與 function arguments 分開(似乎更直觀)。 我使用ruamel.yaml並查看了類似的問題,其中標簽通過 class “注冊”,然后添加到構造函數中。 但是,我不確定加載后是否要檢索標簽信息(它不在ordereddict/CommentedMap 中)。

問題

  1. 如何從節點構建和加載自定義標簽,在哪里可以找到它?
  2. 每個節點可以有多個標簽嗎?

預期結果

我希望有這樣的事情:

- create_annotation: !id my_id1 !ow false 
  tool: mask
- create_annotation: !id my_id2 !ow true 
  tool: mask

這將被解析為:

{tool: mask,
 id: my_id1,
 overwrite: false}

從第二個問題開始:不,每個節點不能有多個標簽。 節點屬性在YAML 文檔中指定

[96]    c-ns-properties(n,c) ::=   ( c-ns-tag-property
                                     ( s-separate(n,c) c-ns-anchor-property )? )
                                 | ( c-ns-anchor-property
                                     ( s-separate(n,c) c-ns-tag-property )? ) 

這不允許多個標簽屬性。 通常,該標簽用於制作特定的 class 實例,我不確定需要實例化或組合多個此類實例。

因此,如果您解析示例,會發生什么情況!id將被視為標量字符串my_id1 !ow false的標記,它恰好有一些看起來像標記的東西作為字符串的一部分:

import ruamel.yaml

yaml_str = """\
- create_annotation: !id my_id1 !ow false 
  tool: mask
- create_annotation: !id my_id2 !ow true 
  tool: mask
"""

yaml = ruamel.yaml.YAML()
data = yaml.load(yaml_str)
scalar = data[0]['create_annotation']
print(f'scalar: "{scalar}", id: "{scalar.tag.value}"')

這使:

scalar: "my_id1 !ow false", id: "!id"

如您所見,標簽是它之前的值節點的一部分,並且不存儲它所屬的CommentedMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM