我有一个包含内容的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/'}}
如果任何键没有值,我如何填写默认参数?
答案 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')
如果密钥key
在a
中,它将返回值,否则它将返回您指定的默认值。在上面例如'default'