2017-10-04 18 views
1

yaml.load를 사용할 때 ruamel.yaml이 앵커 병합을 방지하려면 어떻게해야합니까? 그대로 난 그냥 같은 production -> host & production -> port 일부 키를 수정하고 파일 config.yaml에서 YAML의 예는 다음 당신이 할 수있는 경우ruamel.yaml을 사용하여로드/덤프 YAML에 앵커 및 별칭 유지

defaults: &defaults 
    host: <%= ENV.fetch("VBOX_IP", "127.0.0.1") %> 
    adapter: mysql2 
    reconnect: true 
    encoding: utf8 
    username: root 

production: 
    default: 
    <<: *defaults 
    host: dbname.domain.com 
    port: 3306 

답변

0

을 파일로 덤프 파일을 유지하고 싶은 :

import sys 
import ruamel.yaml 


yaml = ruamel.yaml.YAML() 

with open('config.yaml') as ifp: 
    data = yaml.load(ifp) 
data['defaults']['reconnect'] = False 
data['production']['default']['port'] += 1 

with open('config.yaml', 'w') as ofp: 
    yaml.dump(data, ofp) 
(

defaults: &defaults 
    host: <%= ENV.fetch("VBOX_IP", "127.0.0.1") %> 
    adapter: mysql2 
    reconnect: false 
    encoding: utf8 
    username: root 

production: 
    default: 
    <<: *defaults 
    host: dbname.domain.com 
    port: 3307 

기본 YAML() :

는 업데이트 된 파일을 얻을 수 있습니다 YAML(typ='rt')에 해당)은 앵커 이름과 병합 키 (<<)를 모두 유지하는 왕복 로더/덤퍼를 가져옵니다.

당신이 할 경우주의하시기 바랍니다 :

data['production']['default']['reconnect'] = 'False' 

다음 reconnect 키는 병합 키로 시작하는 매핑에 추가 될 것입니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 스크립트에서 원치 않는 결과를 초래하는 속성을 설정하는 버그를 발견했습니다. –