如何使用PyYAML

时间:2018-10-06 00:14:05

标签: yaml pyyaml

我将YAML用作配置引擎,我需要以可以按分层方式拆分配置的方式使用它,比如说我有一个base.yaml,其中包含一些默认值,然后将其覆盖。覆盖基本值的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文件。

1 个答案:

答案 0 :(得分:1)

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

"some string"
value: overridden

,它也不是有效的YAML。

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

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

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