2017-10-04 12 views
1

ruamel.yamlがyaml.loadを使用してアンカーをマージするのを避けるにはどうすればよいですか? 私はちょうどそのような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

詳細な回答ありがとうございます。スクリプト内に、望ましくない結果を引き起こす属性を設定するバグが見つかりました –

関連する問題