ys memos

Blog

Pythonで大体Switchの代替になる関数


python

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

関連タグを探す