如何使用 PyYAML 包含另一个 YAML 作为全局基础文件

How to include another YAML as a global base file using PyYAML

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

base.yaml

value: base

overridden.yaml

!include base.yaml

value: overridden

最后,如果我加载 overridden.yaml 文件,理想情况下我希望看到设置为 "overridden".

的值

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

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

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

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

"some string"
value: overridden

这也不是有效的 YAML。

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

IMO 应该注意的是将 language indepedent merge feature 与 include 结合使用。您的 base.yaml 可以看起来一样,然后您的 overridden.yaml 可以看起来像:

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