2

次のコードがあります。

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

allservicesは辞書リストで、servicesは辞書です。このコードは関数内にあり、2 回呼び出されます。初めてうまくいきます。ただし、2回目には、次のようになります。

ファイル "/media/sf_virtual_shared_folder/workfolder/omeganoc-sprint/onoc/omeganoc/grapher.py"、338 行目、allservices のサービスの get_logical_dependencies_components: KeyError: 9

これで、存在しない辞書の要素を入力しようとすると、キーエラーが発生することがわかりました。しかし、ここで辞書のいくつかの値を初期化または編集しようとしましたが、最初は正常に機能し、2 回目は機能しません。

この問題の原因と対処方法を教えてください。

編集: 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:

OK、デバッガーを使用して、エラーが実際にはループの最後の行にあることがわかりました。

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

そして、それはホストに要素hosts[serv['host']]がないためです。これは実際には hosts[9]であり、したがってキーエラー: 9.

ただし、この要素がなくても、ここで初期化する必要があるため、なぜ機能しないのかまだわかりませんか?

4

1 に答える 1

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

于 2013-06-05T15:25:36.397 に答える