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_one
、it_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
代替。
有可能在 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_one
、it_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
代替。