YAML 将多个锚点合并到同一个映射中
Posted
技术标签:
【中文标题】YAML 将多个锚点合并到同一个映射中【英文标题】:YAML merge multiply anchors into the same map 【发布时间】:2021-01-21 06:35:44 【问题描述】:不清楚是否可以对同一张地图多次使用YAML merge key operator。
困惑来自:
merge key 仅在过时的 YAML 1.1 中定义为可选扩展。 https://yaml.org/spec/1.2/spec.html 中没有提及它原始规范说:
“
但他们没有提供示例,我在其他地方也找不到。喜欢:
defs:
- map1: &map1-ref
key1: val1
- map2: &map2-ref
key2: val2
config:
database:
<<: *map1-ref
<<: *map2-ref
key3: val3
哪些主要的解析器支持多重合并(python/ruby/java/node)?
更新 Python 3检查代码:
import yaml
with open("my.yml") as f:
y = yaml.safe_load(f)
print(y)
UPDATE 2 @flyx 的建议语法可以用另一种方式编写:
config:
database:
<<:
- *map1-ref
- *map2-ref
key3: val3
【问题讨论】:
【参考方案1】:虽然快速测试表明 PyYAML 确实支持这一点,但我建议不要这样做,因为在同一个映射中具有多个相同的键 (<<
) 违反了核心 YAML 规范(1.1 和 1.2)。
此外,由于合并键可以将多个映射作为参数,因此没有必要:
defs:
- map1: &map1-ref
key1: val1
- map2: &map2-ref
key2: val2
config:
database:
<<: [*map1-ref, *map2-ref]
key3: val3
如果您使用这种语法,问题归结为“哪些实现支持合并键”。我无法给出完整的列表,但我知道的是:
支持: PyYAML Java 的 SnakeYAML 鲁比的心灵 Perl 的YAML::PP
go-yaml
不支持:
yaml-cpp (GH issue)
libyaml(因为它的主接口是事件流,级别太低了)
NimYAML(我的工作)
AdaYaml(我的工作)
【讨论】:
以上是关于YAML 将多个锚点合并到同一个映射中的主要内容,如果未能解决你的问题,请参考以下文章
javascript jQuery 1.7+中锚点的GA事件