2017-12-28 19 views
0

ruamel.yamlにYAMLファイルをロードしたときと同じバージョンでダンプする良い方法はありますか?ファイル内に%YAML 1.1ディレクティブがある場合は、version='1.1'をハードコードせずにYAML 1.1でファイルをダンプすることができます。YAMLをruamel.yamlでロードしたのと同じバージョンでダンプする方法はありますか?

ので

%YAML 1.1 
--- 
is_string: 'on' 
is_boolean: on 

、のようないくつかのデータを与えられた私はround_trip_dump()にハードコーディングversion='1.1'を避けたい、

x = f.read() 
d = round_trip_load(x) 
round_trip_dump(d, f, explicit_start=True) 

答えて

1

YAMLファイルのバージョンが取得つかの間の値であり、ロード後にリセットしてください。それは、最新のドキュメントのバージョンを何らかの形で利用可能にするという私の計画でしたが、ストリーム内に複数のドキュメントがある場合、これはもっと考えが必要です。

単一のドキュメントストリームでは、以下を実行してディレクティブからバージョンを取得できます。これはすべて新しいAPIで行われます。属性を付けるために何YAML()インスタンスが存在しないので、あなたが同じことが可能、より多くの困難な例で使用している古いAPIで:

import sys 
from ruamel.yaml import YAML 
from ruamel.yaml.parser import Parser 

yaml_str = """\ 
%YAML 1.1 
--- 
is_string: 'on' 
is_boolean: on 
""" 

class MyParser(Parser): 
    def dispose(self): 
     self.loader.last_yaml_version = self.yaml_version 
     Parser.dispose(self) 


yaml = YAML() 
yaml.Parser = MyParser 
data = yaml.load(yaml_str) 

yaml2 = YAML() 
yaml2.version = yaml.last_yaml_version 
yaml2.dump(data, sys.stdout) 

与える:

%YAML 1.1 
--- 
is_string: 'on' 
is_boolean: true 

ことに注意してください%YAML 1.1ディレクティブに遭遇したときに、 "バージョン管理されていない"読み取りがyamlインスタンスを完全にリセットしないので、出力用にクリーンな新しいオブジェクトを作成する必要があります。

is_booleanに関連付けられた値をonとしてダンプすることもできますが、それはストリーム内のすべてのブール値に影響します。

関連する問題