2020/08/20
Pythonは書きやすくて便利ですよね!ですが,Switch-case文が欲しいなと思う事があると思うんです. そんな時のために,ほぼSwitch文として扱う事ができる関数(というほどのものでもないもの)を作成したので,備忘録として記します. ご自由にお使いください.
基本文(文字列を条件にする)
from functools import partial
def py_switch(val, branch):
for condition, bound_func in branch.items():
if val == condition:
return bound_func()
def process_1(msg):
print('process1:', msg)
return 1
def process_2():
print('process2が実行されましたよー')
return 2
condition = 'condition_1'
result = py_switch(
condition,
{
"condition_1": partial(process_1, 'コンニチハ'),
"condition_2": partial(process_2)
}
)
こんな感じ.条件となる変数を第一引数とし,第二引数はmap形式の(条件, 処理)
として与える.
条件は,数値型でもよい.
ここで,partial()
にしないとJSONの引数生成時に関数の値の評価(?)がされてしまうので,注意が必要.
partial()
にしないと・・・
戻り値だけを必要とする場合なら結果的な不都合はなかなか起こらないだろうが,この例のように関数中でprintしている場合は思い通りの挙動をしてくれなくなる.また,全ての処理を行ってしまうので,各処理が大きければ実行時間へ悪影響を及ぼす懸念がある.
おまけ(数値も条件にする)
上の例だけではわかりづらいかもしれないので、数値を条件式にする例およびテストコードを残す。
まずはpy_switch
の準備
#!/usr/local/env python3
from functools import partial
def py_switch(val, branch):
for condition, bound_func in branch.items():
if val == condition:
return bound_func()
def process_1(msg):
print('process1:', msg)
return '1'
def process_2():
print('process2が実行されましたよー')
return '2'
def process_3():
print('条件値は数値の1だね!')
return 1
def process_4(msg):
print('条件値は数値の2だね!', msg)
return 2
テスト1
condition = 'condition_1'
result = py_switch(
condition,
{
"condition_1": partial(process_1, 'コンニチハ'),
"condition_2": partial(process_2),
1: partial(process_3),
2: partial(process_4, 'コンバンハ')
}
)
print('pyswitchの戻り値はresult')
結果が以下
process1: コンニチハ
pyswitchの戻り値は 1
テスト2
condition = 2
result = py_switch(
condition,
{
"condition_1": partial(process_1, 'コンニチハ'),
"condition_2": partial(process_2),
1: partial(process_3),
2: partial(process_4, 'コンバンハ')
}
)
print('pyswitchの戻り値は', result)
結果が以下
条件値は数値の2だね! コンバンハ
pyswitchの戻り値は 2