如何使用python填充yaml文件中的默认参数

时间:2016-04-25 04:25:06

标签: python yaml

我有一个包含内容的YAML文件:

       image_name: ubuntu
       components:
                 image_name: ubuntu
                 image_flavors: [medium, large]
                 image_ip : 192.168.12.134
                 imageuser : ubuntu
                 image_pass : ubuntu
                 image_config: /home/ubuntu/
                 image_net_type: vlan 
                 image_switch_type: ovs

我已经实现了一个脚本来加载YAML文件和o / p我有dict格式。

       with open("test.yaml", "r") as input:
        try:
            a = yaml.safe_load(input)
            print "Parsing YAML file is completed"
            print a
        except yaml.YAMLError as error:
            print(error)

我的dict格式如下:

{'image_name': 'ubuntu', 'components': {'image_ip': '192.168.12.134', 
 'image_pass': 'ubuntu', 'image_switch_type': 'ovs', 'imageuser': 'ubuntu',
 'image_name': 'ubuntu', 'image_flavors': ['medium', 'large'], 
 'image_net_type': 'vlan', 'image_config': '/home/ubuntu/'}}

如果任何键没有值,我如何填写默认参数?

2 个答案:

答案 0 :(得分:3)

嗯,你的意思是这样的:

default_values = {
    'image_name': 'some',
    'components': {
         'image_ip': '192.168.1.1',
         'image_pass': 'default_password',
         'image_switch_type': 'ovs',
         'imageuser': 'default_user',
         'image_name': 'default_name',
         'image_flavors': ['medium', 'large'],
         'image_net_type': 'vlan',
         'image_config': '/default/home/'
     }
}

def setdefault_recursively(tgt, default = default_values):
    for k in default:
        if isinstance(default[k], dict): # if the current item is a dict,
            # expand it recursively
            setdefault_recursively(tgt.setdefault(k, {}), default[k])
        else:
            # ... otherwise simply set a default value if it's not set before
            tgt.setdefault(k, default[k])

dic = { 'image_name': 'ubuntu', 'components': { 'image_name': 'ubuntu' }

setdefault_recursively(dic)

这应该使用默认值从yaml文件中读取dic读取,递归:

{'components': {'image_config': '/default/home/',
            'image_flavors': ['medium', 'large'],
            'image_ip': '192.168.1.1',
            'image_name': 'ubuntu',
            'image_net_type': 'vlan',
            'image_pass': 'default_password',
            'image_switch_type': 'ovs',
            'imageuser': 'default_user'},
 'image_name': 'ubuntu'}

也就是说,结构中没有从YAML文件中明确设置的所有设置都已经从default_values,uhmm,递归地接收到它们的默认值。

答案 1 :(得分:0)

一个选项是当你从yaml解析的dict中获取一个键的值时,使用dict的get()方法。所以

value = a.get('key', 'default')

如果密钥keya中,它将返回值,否则它将返回您指定的默认值。在上面例如'default'