2017-09-06 53 views
2

工作我试图加载如下所示的多文件YAML配置文件:YAML 1.2指令与多个文件不在不安全模式

文件:

%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) 

回答

1

错误是这样的,唉,预期的行为。 ruamel.yamlPyYAML衍生,这本身依赖于libyaml,用于快速C基装载和倾倒。 PyYAMLlibyaml都是由Kirill Simonov开发的。虽然也有一些事情1.2和PyYAML支持libyaml(例如无漂浮在他们的尾数小数点),这两个“唯一”实施最YAML 1.1。

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

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

当然,这应当至少适当记录,但优选的C代码应当适于支撑圆跳闸。在检修C代码以进行往返操作时,它也将适用于支持YAML 1.2进行安全/不安全/基本加载。