📖

【Python】関数に振り分ける分岐処理を簡略化しよう

2022/12/28に公開

こんな処理、ありがち

変数をステータスとして、そのステータスによって分岐させることってよくありますよね。
私もよくあります。

例えば、以下のような状態だとしましょう。

# 分岐先の関数を定義
def one():
    print('one()が実行されました。')

def two():
    print('two()が実行されました。')

def three():
    print('three()が実行されました。')

def default():
    print('default()が実行されました。')

# xをもとに各関数に分岐する 
x = 2

if x == 1:
    one();
elif x == 2:
    two();
elif x == 3:
    three();
else:
    default();

何か一見最適化されていて、これ以上簡略化はできなさそうな感じがしますね。
できるとしたら、ifやelseの中身を同じ行にまとめてしまうことでしょうか。

でも実は、もっと分岐を簡略化できちゃいます。

簡略化

関数の定義を除くと、分岐の箇所を以下のように簡略化できます。

# xをもとに各関数に分岐する 
x = 2
actions = {1: one, 2: two, 3: three}
action = actions.get(x, default)
action()

なぜこうなるのか

あるPythonをある程度慣れている方は、すぐに理解できてしまっていると思います。
分からない方のためにサックリ説明します。

  1. 各関数を分岐したい条件と一致する値のキーでdict化します。

    actions = {1: one, 2: two, 3: three}
    
  2. そのdictが持つgetメソッドを、ステータスとなる変数をキーに実行します。
    渡したキーに一致する要素があれば、その関数が戻ってきます。
    なければ、getメソッドの第二引数が戻ってきます。

    action = actions.get(x, default)
    
  3. 戻ってきた関数が入った変数を実行しましょう。

    action()
    

それではよいPythonライフを。

参考

Discussion