我有以下代码:
for serv in allservices:
services[serv['id']] = serv
hosts[serv['host']]['services'][serv['id']] = serv
其中 allservices 是字典列表,services 是字典。 这段代码在一个函数中,被调用了两次。第一次它工作正常。然而,第二次,我得到了这个:
File "/media/sf_virtual_shared_folder/workfolder/omeganoc-sprint/onoc/omeganoc/grapher.py", line 338, in get_logical_dependencies_components for serv in allservices: KeyError: 9
现在,我知道当我们尝试输入不存在的字典元素时会出现关键错误。但是,在这里我尝试初始化或编辑字典的一些值,第一次它工作正常,第二次它没有。
是什么导致了这个问题,我该如何处理?
编辑: allservices 和services 的定义:
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 我没有元素 hosts[serv['host']] ,实际上是 hosts[9],因此出现关键错误:9。
但是,即使我没有这个元素 - 它应该在这里初始化,所以我仍然不明白为什么它不起作用?
最佳答案
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()
关于初始化字典的 Python KeyError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16943269/