2017-09-06 18 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進行安全/不安全/基本加載。