2017-12-28 35 views
0

ruamel.yaml은 YAML 파일을로드 할 때와 동일한 버전으로 덤프하는 좋은 방법이 있습니까? 파일에 %YAML 1.1 지시문이있는 경우 version='1.1'을 하드 코드하지 않고 YAML 1.1에서 파일을 다시 덤프 할 수 있기를 원합니다.YAML을 ruamel.yaml로로드 된 동일한 버전으로 덤프 할 수 있습니까?

내가 round_trip_dump()version='1.1'을 하드 코딩하지 않도록하고 싶습니다

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

그래서 같은 일부 데이터를 제공 ,

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 지시문을 만나면 "unversioned"읽기가 yaml 인스턴스를 완전히 재설정하지 않기 때문에 출력용으로 깨끗하고 새로운 객체를 만들어야합니다.

is_boolean과 연결된 값을 on으로 버릴 수도 있지만 스트림의 모든 부울에 영향을 미칩니다.