YAML 中具有相同属性的两个项目

two items with the same attributes in YAML

有可能在 YAML 文件中使用相同的属性来执行多个项目,但实际上不需要复制它们吗?
例如,我有:

item1:  
    it_one:  
        some: {...}  
    it_two:
        somemore: {...}
item2:
    the_same_as_in_item1

如何指定 item1 和 item2 具有相同的属性? 最后我想:

item1[it_one][some]  
item2[it_one][some]

给我相同的结果。

YAML 中可以帮助您解决问题的机制是使用 anchors and aliases。但是,您必须注意这些,因为当您为 YAML 映射设置别名(作为 Python dict 加载)时,您将获得附加到 [=] 的 dict 的相同实例14=] 和 item2.

如果这不是您想要的,可以对 merge key 形式的别名进行特定解释。要使用它,请指定一个键 <<:

item1: &repl  
    it_one:  
        some: {...}  
    it_two:
        somemore: {...}
item2:
    <<: *repl

这至少会直接在 item2 下为您提供与 item1 具有相同 keys/values 的新字典(即键 it_oneit_two).然而,由于内部加载和处理的方式,这些键 (some: {}) 的值将再次成为同一个对象。

如果那种对象重用有问题,你最好坚持 non-merge 使用别名:

item1: &repl  
    it_one:  
        some: {...}  
    it_two:
        somemore: {...}
item2: *repl

然后遍历树递归地复制新字典(和列表)中的 key-values。

请注意,如果您在 ruamel.yaml 中使用 round_trip_loader,您甚至会共享所有内容,即使在使用合并键时也是如此。没有那个 round-tripping 是不可能的,所以使用 safe_loader 代替。