可以在YAML文件中使用相同的属性执行多个项目,但不需要实际复制它们吗? 例如,我有:
item1:
it_one:
some: {...}
it_two:
somemore: {...}
item2:
the_same_as_in_item1
如何指定item1和item2具有相同的属性? 最后我想:
item1[it_one][some]
item2[it_one][some]
给我相同的结果。
答案 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_one
,it_two
)。然而,由于在内部加载和处理这些键的方式,这些键(some: {}
)的值将是同一个对象。
如果这种对象重用有问题,最好坚持使用别名的非合并:
item1: &repl
it_one:
some: {...}
it_two:
somemore: {...}
item2: *repl
并遍历树,递归地复制新dicts(和列表)中的键值。
请注意,如果您使用ruamel.yaml
中的round_trip_loader
,即使使用合并密钥,您甚至可以共享所有内容。如果没有这种往返,则不能使用safe_loader
。