2017-02-17 42 views
3

可以在YAML文件中做几个具有相同属性但不需要实际复制它们的项目?
例如,我有:YAML中具有相同属性的两个项目

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

如何指定,该物品1和ITEM2都具有相同的属性? 最后我想:

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

给我相同的结果。

回答

1

YAML中可以帮助你的机制是使用anchors and aliases。有了这些,你必须注意,因为当你别名一个YAML映射(作为Python dict加载)时,你会得到dict的相同实例,连接到item1item2

如果这不是您想要的,则以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 

,走在树递归地复制在新的类型的字典的键值(和列表)。

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

+0

非常感谢,这正是我一直在寻找的! – Andreios

相关问题