【问题标题】:Python KeyError exception for initializing dictionary初始化字典的 Python KeyError 异常
【发布时间】:2013-06-05 15:01:15
【问题描述】:

我有以下代码:

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 在所有服务中服务: 关键错误: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。

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

【问题讨论】:

  • 你能把剩下的代码贴出来吗?
  • 什么是服务类变量?是dict 还是别的什么?
  • 循环中的print serv 给出了什么?
  • 打印服务给出:{'host': 4, 'required_services': {}, 'id': 40, 'dependent_services': {}, 'name': u'HTTP-www.maison -etanche.com'},因为列表的每个元素都是字典。
  • 根据错误消息,在for serv in allservices 行中引发了异常 - 如果allservices 不是一个列表,而是一个类似列表的对象,这将是令人惊讶的,但也有可能。

标签: python python-2.7 dictionary flask


【解决方案1】:
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() 解决此问题

【讨论】:

  • Tnx 寻求帮助,但我已经解决了问题。毕竟这是我的数据的一些逻辑问题(我从不同的来源获取值,我应该使用相同的来源,所以第一次我有主机,第二次我没有)。所以,这和你说的有点像 - 它没有初始化,但它会获取。
猜你喜欢
  • 1970-01-01
  • 2012-04-27
  • 2017-11-15
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多