Python 解析ruamel.yaml中的多个自定义标记

Python 解析ruamel.yaml中的多个自定义标记,python,yaml,ruamel.yaml,Python,Yaml,Ruamel.yaml,背景:在我的计算机视觉程序中,用户正在修改YAML文件以提供注释函数(列表项是函数,标量序列是参数)。工作流是open/modify YAML file>save YAML>parse and execute functions>show results,然后重新开始或保存。一个文件中可以有同一工具的多个实例,通过“id”标量进行区分。由于注释是在每次迭代后保存的,因此它们还需要控制覆盖行为,覆盖行为也由标量控制 - create_annotation: id: my_id1 over

背景:在我的计算机视觉程序中,用户正在修改YAML文件以提供注释函数(列表项是函数,标量序列是参数)。工作流是
open/modify YAML file>save YAML>parse and execute functions>show results,然后重新开始或保存。一个文件中可以有同一工具的多个实例,通过“id”标量进行区分。由于注释是在每次迭代后保存的,因此它们还需要控制覆盖行为,覆盖行为也由标量控制

- create_annotation: 
  id: my_id1
  overwrite: false
  tool: mask
- create_annotation: 
  id: my_id2
  overwrite: true
  tool: mask
问题我想开始使用一些自定义YAML标记将实例/覆盖语句与函数参数分开(看起来更直观)。我使用了
ruamel.yaml
,并研究了类似的问题,其中标记通过类“注册”,然后添加到构造函数中。但是,我不确定加载后如何检索标签信息(它不在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}
    

    从第二个问题开始:不,每个节点不能有多个标记。节点属性在中指定

    这不允许有多个标记属性。通常,该标记用于创建一个特定的类实例,我不确定如何实例化或组合多个这样的实例

    因此,如果您分析您的示例,会发生什么呢!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中。

    谢谢,我不确定我怎么会错过其中的“TaggedScalar”…归咎于ruamel。yaml的作者没有提供足够的文档。注释之类的内容(大部分)附加到集合类型,但不附加到标记。他们在标记自己的物体上行走
    scalar: "my_id1 !ow false", id: "!id"