2

我正在尝试加载一个多文件 yaml 配置文件,如下所示:

文件:

%YAML 1.2
---
num_epochs: 1
---
num_epochs: 1

而python脚本是:

from ruamel.yaml import YAML

yaml = YAML(typ='unsafe')
configs = yaml.load_all(Path(Experiment.config_file))
for config in configs:
    print(config)

执行时,会出现以下错误:

ruamel.yaml.parser.ParserError: found incompatible YAML document
in "../MAML_tensorflow/experiment.yml", line 1, column 1

如果我load_all直接从模块中使用导入,则该文件有效。这是预期的行为吗?

这可能是一个错误,因为将实现标志设置为pure给出正确的解析结果。

from ruamel.yaml import YAML

yaml = YAML(typ='unsafe', pure=True)
configs = yaml.load_all(Path(Experiment.config_file))
for config in configs:
print(config)

虽然这没有并给出了上面的错误

from ruamel.yaml import YAML

yaml = YAML(typ='unsafe')
configs = yaml.load_all(Path(Experiment.config_file))
for config in configs:
    print(config)
4

1 回答 1

1

唉,这是预期的行为。ruamel.yaml源自PyYAML,它本身依赖于libyaml,用于基于 C 的快速加载和转储。PyYAML并且libyaml都由Kirill Simonov开发。尽管有一些 1.2 的东西PyYAMLlibyaml支持(例如尾数中没有小数点的浮点数),但这两个“仅”实现了 YAML 1.1 的大部分内容。

最初ruamel.yaml链接libyaml到提供快速,但由于一段时间以来它有自己的源代码副本,这使得创建轮子(.whl)更容易,特别是对于 Windows 版本的 Python。

当前(0.15.33)版本中包含的 C 源ruamel.yaml代码与libyaml. 这就是往返解析器没有等效的 C/非纯版本的原因,也是安全/不安全/基本加载器的纯版本接受 YAML 1.2 和非纯(基于 C)版本的原因不是。

当然,这至少应该适当地记录下来,但最好应该调整 C 代码以支持往返。在大修 C 代码以实现往返的同时,它还将适用于支持 YAML 1.2 以实现安全/不安全/基本加载。


在 ruamel.yaml 0.15.62 中,C 阅读器/解析器接受%YAML 1.2并且发射器允许使用该指令进行转储。

没有更改实际代码,因此读者仍然会解析 YAML 1.1 unicode 换行符和八进制等。转储应该不会出现问题(例如,基于 C 的转储程序从不转储八进制)。

(参考 中的test_load_cyaml_1_2()test_dump_cyaml_1_2()测试test_cyaml.py

于 2017-09-06T05:10:35.963 回答