LoginSignup
1
8

More than 5 years have passed since last update.

Python で、switch 文のマネをする

Last updated at Posted at 2017-10-18

switch は書けないし、とはいえ if else はカッコ悪くて書きたくない!

C++を普段使っている人が遭遇しやすい状況かなと思います。
そう思う人も、そう思わない人も、まずは例を挙げてみますね。

if else によるカッコ悪い分岐

qiita.py
from enum import Enum

class Color( Enum ):
    R = 0
    G = 1
    B = 2

def callback_r():
    print( "callback_r" )
    pass

def callback_g():
    print( "callback_g" )
    pass

def callback_b():
    print( "callback_b" )
    pass

def callback_default():
    print( "callback_default" )
    pass

def switcher( color ):
    if color == Color.R:
        callback_r()
    elif color == Color.G:
        callback_g()
    elif color == Color.B:
        callback_b()
    else:
        callback_default()

教科書通りのコードですが、これを書いてみていやな感じがしました。
どうにも冗長性を排除できず、バグが入り込む余地を多分に残しているように思えます。
switcher メソッドに少し手を加えてみます。

関数テーブルを用いたシステマティックな分岐

qiita.py


def switcher( color ):
    tbl = {}
    tbl[ Color.R ] = callback_r
    tbl[ Color.G ] = callback_g
    tbl[ Color.B ] = callback_b

    for c in Color:
        if c == color:
            return tbl[ c ]

    return callback_default

分岐の条件になるキーと、実行されるべきメソッドが必ず1対1となるような構造に変更しました。
これは分岐処理の途中で関係のないコード片を挿入される心配が一切ないことを意味します。
また間違ったメソッドが対応付けされていたとしても関数テーブルを定義しているコードブロックを確認すればすぐに気づくことができます。

1
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
8