我将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文件。
答案 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