用于初始化字典的Python KeyError异常

时间:2013-06-05 15:01:15

标签: python python-2.7 dictionary flask

我有以下代码:

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。

然而,即使我没有这个元素 - 它应该在这里初始化,所以我仍然不明白为什么它不起作用?

1 个答案:

答案 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 exceptget()

解决此问题