2013-06-05 56 views
1

我有以下代碼:的Python KeyError異常例外初始化字典

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

其中allservices是字典列表和服務是一本字典。 此代碼位於一個函數中,該函數被調用兩次。它第一次工作正常。在第二時間,但是,我得到這個:

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服務定義:

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:

OK,使用調試器,我發現該錯誤實際上是在循環的最後一行,即i N:

hosts[serv['host']]['services'][serv['id']] = serv 

而且,這是因爲在主機我沒有元素主機[SERV [ '主機'],這實際上是主機[9 ],因此關鍵錯誤:9.

但是,即使我沒有這個元素 - 它應該在這裏初始化,所以我仍然不明白爲什麼它不起作用?

+1

解決這個問題,你可以發佈你的代碼的其餘部分? – dm03514

+0

什麼是服務類變量?是「詞典」還是其他的東西? – ElmoVanKielmo

+0

循環中的'print serv'是什麼給了? – RedBaron

回答

2
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()

+0

Tnx的幫助,但我已經解決了這個問題。我的數據畢竟是一個合乎邏輯的問題(我從不同來源獲得價值,我應該使用相同的來源,所以第一次有主持人,第二次我沒有)。所以,它跟你說的是一樣的 - 它不會初始化,但它會提取。 – Belphegor