YAML中具有相同属性的两个项目
问题描述:
可以在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]
给我相同的结果。
答
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_one
,it_two
)。然而,这些键的值(some: {}
)也是同一个对象,因为这是在内部加载和处理的。
如果那样的对象重用是有问题的,你最好坚持使用非合并使用别名:
item1: &repl
it_one:
some: {...}
it_two:
somemore: {...}
item2: *repl
,走在树递归地复制在新的类型的字典的键值(和列表)。
请注意,如果您在ruamel.yaml
中使用round_trip_loader
,即使使用合并密钥,您甚至可以共享所有内容。如果没有这种往返行程将不可能,所以请使用safe_loader
。
非常感谢,这正是我一直在寻找的! – Andreios