初始化字典的 Python KeyError 异常

标签 python python-2.7 dictionary flask

我有以下代码:

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

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

是什么导致了这个问题,我该如何处理?

编辑: 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 我没有元素 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 exceptget()

解决此问题

关于初始化字典的 Python KeyError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16943269/

相关文章:

python - 如何在 Python 字典中转换包含以下输出的表?

python - __getattr__ 在 python 中递归

python - 从两个 numpy 数组创建字典

python - 如何从读取的 csv 中重新计算每个类(class)的人数

python - 正则表达式:匹配字符串中的多个时间戳

python - 使用两个嵌套 for 循环打印两个列表的公共(public)元素

python - matlab在python中的 "permute"

python - 如何创建返回 `True` 的匿名函数?

Python:从字典运行代码

Python将顺序值数组添加到dict