Pythonでネストを減らす(if文によるdictのキーチェック編)
やりたいこと
元の方法
YAMLで記述された設定ファイルを読み込み、item_listキーが存在する場合にのみ、キーに対するリストに対してループ処理をするサンプルです。
for文でループ処理する前にif文でキーチェックをしているため、ネストが深くなってしまっています。
with open(config_file) as f:
config = yaml.load(f)
if 'item_list' in config:
for item in config['item_list']:
# ここでやりたい処理を記述
三項演算子を使って改善した方法
Pythonの三項演算子を使うことで、if文のキーチェックをfor文の行に持ってくることができます。
with open(config_file) as f:
config = yaml.load(f)
for item in config['item_list'] if 'item_list' in config else list():
# ここでやりたい処理を記述
上記のように記述することで、
- item_listキーが存在する場合は、そのキーに対するリストに対してループ処理
- item_listキーが存在しない場合は、空のリストに対してループ処理(つまり、処理をスキップさせる)
ことができます。
dictのgetを使って改善した方法
dictのgetメソッドを使うことで、さらにシンプルに記載できます。
with open(config_file) as f:
config = yaml.load(f)
for item in config.get('item_list', list()):
# ここでやりたい処理を記述
dictのgetメソッドでは、get(key[, default]) のように記述でき、下記の振る舞いをします。
- dictにkeyが存在していれば、それに対する値を返す
- dictにkeyが存在していなければ、defaultを返す
- defaultが与えられない場合は、Noneを返す