2

我有以下代码:

for serv in allservices:
    services[serv['id']] = serv
    hosts[serv['host']]['services'][serv['id']] = serv

其中allservices是字典列表,services是字典。这段代码在一个函数中,它被调用了两次。第一次它工作正常。然而,在第二次,我得到了这个:

文件“/media/sf_virtual_shared_folder/workfolder/omeganoc-sprint/onoc/omeganoc/grapher.py”,第 338 行,在 get_logical_dependencies_components 中用于所有服务中的 serv:KeyError:9

现在,我知道当我们尝试输入不存在的字典元素时会出现关键错误。但是,在这里我尝试初始化或编辑字典的一些值,第一次它工作正常,第二次它没有。

什么可能导致此问题,我该如何处理?

编辑:allservicesservices 的定义:

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。

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

4

1 回答 1

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']]。您可以通过使用 atry except或 a来解决此问题get()

于 2013-06-05T15:25:36.397 回答