我有以下代码:
for serv in allservices:
services[serv['id']] = serv
hosts[serv['host']]['services'][serv['id']] = serv
其中 allservices 是字典列表, 服务 是字典。 此代码位于一个函数中,该函数被调用两次。它第一次工作正常。然而,第二次,我得到了这个:
文件 “/media/sf_virtual_shared_folder/workfolder/omeganoc-sprint/onoc/omeganoc/grapher.py” 第338行,在get_logical_dependencies_components中 for allservices中的serv: KeyError:9
现在,我知道当我们尝试输入不存在的字典元素时会出现关键错误。但是,在这里我尝试初始化或编辑字典的某些值,并且第一次它工作正常,而第二次它没有。
导致此问题的原因是什么?如何处理?
修改 所有服务 和 服务 的定义:
allservices = [{'id':s.id,
'name':s.get_name(),
'host': s.host.id,
'required_services': {},
'dependent_services': {}}
for s in shinken.get_all_service()]
...
services = {}
编辑2:
好的,使用调试器,我发现错误实际上是在循环的最后一行,在:
hosts[serv['host']]['services'][serv['id']] = serv
而且,因为在 主机 中我没有元素 hosts [serv ['host']] ,实际上是 hosts [9] ,因此出现了关键错误:9。
然而,即使我没有这个元素 - 它应该在这里初始化,所以我仍然不明白为什么它不起作用?
答案 0 :(得分:3)
hosts[serv['host']]['services'][serv['id']] = serv
此行未初始化hosts[serv['host']]
。它的作用大致如下
a=hosts[serv['host']]
b=a['services']
c=b[serv['id']]
c=serv
因此,不是初始化hosts[serv['host']]
,而是提取 hosts[serv['host']]
。您可以使用try except
或get()