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

时间:2017-02-17 09:31:54

标签: python yaml pyyaml

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

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

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

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

给我相同的结果。

1 个答案:

答案 0 :(得分:1)

YAML中可以帮助您的机制是使用anchors and aliases。有了你必须注意的那些,因为当你为一个YAML映射(加载为Python dict)做别名时,你将获得与dict相关联的item1的相同实例, item2

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

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

这将至少直接在item2下使用与item1相同的键/值的新词典(即键it_oneit_two)。然而,由于在内部加载和处理这些键的方式,这些键(some: {})的值将是同一个对象。

如果这种对象重用有问题,最好坚持使用别名的非合并:

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

并遍历树,递归地复制新dicts(和列表)中的键值。

请注意,如果您使用ruamel.yaml中的round_trip_loader,即使使用合并密钥,您甚至可以共享所有内容。如果没有这种往返,则不能使用safe_loader