を使用するpython3.4 JSONとしてエクスポートされたファイアウォールルールベースをフィルタリングして辞書に変換しようとしています。私はユーザー定義の基準に基づいてフィルタを適用したいが、多くのループとif文を持つ構造を読みにくくすることができないように思えます。簡単で読みやすい方法でフィルタ辞書
私のファイアウォールのエントリのdictはかなり大きいので、私はそれらを短くしました。
2例:
entry1 = {'action': 'accept',
'dstintf': [{'name': 'ZN_HDW', 'q_origin_key': 'ZN_HDW'}],
'srcintf': [{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
entry2 = {'action': 'accept',
'dstintf': [{'name': 'ZN_HDW', 'q_origin_key': 'ZN_HDW'}],
'srcintf': [{'name': 'ZN_DMZ', 'q_origin_key': 'ZN_DMZ'},
{'name': 'ZN_MGMT', 'q_origin_key': 'ZN_MGMT'},
{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
私は2例と比較するためのデータ構造を作成したいと次に作成した:私は終了し、これらの構造を比較する方法についていくつか検索した後
filter = {'action': 'accept',
'srcintf': [{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
読みやすいコードで私の問題は、複数の送信元インターフェイスを持つentry2で評価されないということです。
>>> filter.items() <= entry1.items()
True
>>> filter.items() <= entry2.items()
False
どのようにすればいいですか?
EDIT: 以下の回答を使用して、私は何かを作成することができます(下記参照)。その他のヒント? 'dstintf'
と'srcintf'
内部
example = entry2
# Compare entry to filter
noMatch = 0
for key in filter:
if isinstance(example[key], list):
# Convert list of dicts to list for easier comparing
tmpExample = [d['name'] for d in example[key]]
# Break if entry does not contain all criteria
if not all(value in tmpExample for value in filter[key]):
noMatch = 1
print("No match on: " + str(filter[key]))
break
elif filter[key] != example[key]:
# Simple string comparing
noMatch = 1
print("No match on: " + str(filter[key]))
break
if noMatch == 0:
print("Match")
else:
print(" No match")
おかげで私の結果はまだ見(非常に読みやすいではありません編集)。その他のヒント? – marvink
@marvink:更新を参照してください。今はもっと読みやすいかもしれません。 –