[英]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 中)。
問題
預期結果
我希望有這樣的事情:
- 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.