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 确实支持这一点,但我建议不要这样做,因为在同一个映射中具有多个相同的键 (&lt;&lt;) 违反了核心 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 将多个锚点合并到同一个映射中的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-x中锚点设置及定位方式

Vue爬坑之旅:vue单页面中锚点跳转

jq实现页面中锚点滚动跳转

javascript jQuery 1.7+中锚点的GA事件

javascript jQuery 1.7+中锚点的GA事件

css中锚点剖析 & 血泪教训