YAML 将多个锚点合并到同一个映射中

gav*_*koa 6 yaml

目前尚不清楚是否可以对同一个映射多次使用YAML 合并键运算符。

\n

困惑来自于:

\n\n

原始规格说:

\n
\n

\xe2\x80\x9c<<\xe2\x80\x9d 合并键用于指示应将一个或多个指定映射的所有键插入到当前映射中。

\n
\n

但他们没有提供示例,我在其他地方找不到它。喜欢:

\n
defs:\n- map1: &map1-ref\n    key1: val1\n- map2: &map2-ref\n    key2: val2\n\nconfig:\n  database:\n    <<: *map1-ref\n    <<: *map2-ref\n    key3: val3\n
Run Code Online (Sandbox Code Playgroud)\n

哪些主要解析器支持多重合并(python/ruby/java/node)?

\n

更新Python 3检查代码:

\n
import yaml\nwith open("my.yml") as f:\n    y = yaml.safe_load(f)\n    print(y)\n
Run Code Online (Sandbox Code Playgroud)\n

UPDATE 2 @flyx建议的语法可以用另一种方式编写:

\n
config:\n  database:\n    <<:\n      - *map1-ref\n      - *map2-ref\n    key3: val3\n
Run Code Online (Sandbox Code Playgroud)\n

fly*_*lyx 13

虽然快速测试表明 PyYAML 确实支持这一点,但我建议不要这样做,因为<<在同一映射中拥有多个相同的键 ( ) 违反了核心 YAML 规范(1.1 和 1.2)。

\n

此外,这是不必要的,因为合并键可以采用多个映射作为参数:

\n
defs:\n- map1: &map1-ref\n    key1: val1\n- map2: &map2-ref\n    key2: val2\n\nconfig:\n  database:\n    <<: [*map1-ref, *map2-ref]\n    key3: val3\n
Run Code Online (Sandbox Code Playgroud)\n

如果您使用此语法,问题可以归结为 \xe2\x80\x9e 哪些实现支持合并键 \xe2\x80\x9c。我无法给出完整列表,但这是我所知道的:

\n
    \n
  • 支持:\n
      \n
    • PyYAML
    • \n
    • Java 的 SnakeYAML
    • \n
    • 鲁比的心灵
    • \n
    • Perl 的YAML::PP
    • \n
    • go-yaml
    • \n
    \n
  • \n
  • 不支持:\n
      \n
    • yaml-cpp(GH问题
    • \n
    • libyaml(因为它的主要接口是事件流,级别太低)
    • \n
    • NimYAML(我的工作)
    • \n
    • AdaYaml(我的作品)
    • \n
    \n
  • \n
\n