Python 解析ruamel.yaml中的多个自定义标记
背景:在我的计算机视觉程序中,用户正在修改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
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"