【问题标题】:How to include another YAML as a global base file using PyYAML如何使用 PyYAML 将另一个 YAML 作为全局基础文件包含在内
【发布时间】:2019-03-11 11:50:57
【问题描述】:

我使用 YAML 作为配置引擎,我需要以这样一种方式使用它,以便我可以以分层方式拆分配置,比如我有一个 base.yaml,其中包含一些默认值,然后是一个覆盖。覆盖基本值的 yaml 文件:

base.yaml

value: base

overridden.yaml

!include base.yaml

value: overridden

最后,如果我加载 overridden.yaml 文件,理想情况下我希望看到设置为“覆盖”的值。

我可以使用这个trick 来包含另一个 YAML 文件,但仍然缺少一个,因为它不允许我在全局包含后立即定义更多条目并出现此错误:

yaml.scanner.ScannerError: mapping values are not allowed here

我正在使用 PyYAML 加载 YAML 文件。

【问题讨论】:

  • 您链接到一个问题。接受的答案是 YAML 没有导入/包含语句。请编辑您的问题并链接到您实际使用的约 10 个答案之一。或者更好:在此处包含您的实际代码。

标签: yaml pyyaml


【解决方案1】:

这不起作用的原因是因为您的 !include 创建了单个节点,因为 YAML 标记适用于单个节点。这与让您的 overridden.yaml 看起来像:

"some string"
value: overridden

这也不是有效的 YAML。

所以它不像!include 会插入文本版本然后处理整个。您可以使用预处理器和/或模板语言来做到这一点,但最终会得到一个无效的 YAML 文件,因为根据 YAML 1.2 标准,映射中的键必须是唯一的,甚至是 PyYAML 支持的过时的键。 (但这并不能阻止 PyYAML 在没有警告的情况下加载它)

IMO 应该查看的是结合使用 language indepedent merge feature 与包含。你的base.yaml 可以看起来一样,你的overridden.yaml 可以看起来像:

- &base !include base.yaml
- <<: *base
  value: overridden

【讨论】:

    猜你喜欢
    • 2016-08-02
    • 2017-05-19
    • 2010-10-06
    • 2017-12-08
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2020-07-22
    • 2021-05-17
    相关资源
    最近更新 更多