aoishiの備忘録

備忘録

Pythonでネストを減らす(if文によるdictのキーチェック編)

やりたいこと

  • PythonJSONないしはYAMLで記述された設定ファイルを読み込みたい
  • 読み込んだ設定ファイルを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を返す

参考