2013-06-05 2 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

Теперь я знаю, что ключ ошибка получается, когда мы пытаемся ввести элемент словаря, который не существует. Но здесь я пытаюсь инициализировать или редактировать некоторые значения словаря, и в первый раз он отлично работает, а второй - нет.

Что может быть причиной этой проблемы и как с ней бороться?

EDIT: Определение 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 = {} 

EDIT 2:

ОК, с отладчиком, я узнал, что ошибка на самом деле находится в последней строке цикла, i п:

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

И это потому, что в хозяев у меня нет элемента хозяев [серв [ 'Host']], что на самом деле хозяева [9 ], и, следовательно, ключевая ошибка: 9.

Однако, даже если у меня нет этого элемента - он должен быть инициализирован здесь, поэтому я до сих пор не понимаю, почему это не работает?

+1

можете ли вы оставить остальную часть своего кода? – dm03514

+0

Каков класс переменных сервисов? Это 'dict' или что-то еще? – 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 except или get()

+0

Tnx за помощью, но я решил проблему. Это была некоторая логическая проблема с моими данными (я принимал значения из разных источников, и я должен был использовать один и тот же источник, поэтому в первый раз у меня был хост, а второй - нет). Итак, это то же самое, что вы говорите - оно не инициализируется, но оно извлекается. – Belphegor

Смежные вопросы