如何使用 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
我正在使用 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