# dict로 구현한 select case
def one(): print ("one")
def two(): print ("two")
def three(): print ("three")
def default(): print ("default")
func_map = {
1 : one,
2 : two,
3 : three
}
i = int(input("Select a number (1-3): "))
try:
func_map.get(i)()
except:
default()
=====================
Select a number (1-3): 1
one
Select a number (1-3): 99
default
=====================
# 값을 리턴하는 select case
def select(i):
cases = {
0: "zero",
1: "one",
2: "two"
}
return cases.get(i, "default selected.")
r = select(2)
print (r)
# 클래스로 구현한 select case
class SelectCase:
def select(self, i):
func_map = {
1 : "one",
2 : "two",
3 : "three",
}
method_name = func_map.get(int(i), "default")
method = getattr(self, method_name)
return method()
def one(self): print ("one")
def two(self): print ("two")
def three(self): print ("three")
def default(self): print ("default")
s = SelectCase()
s.select(1)
===============================
one
s.select(4)
default
===============================
# 메서드 이름 map을 작성하지 않아도 되는 유사 select case 구현
class PseudoSelectCase:
#=========================================
def case_one(self): print ("one")
def case_two(self): print ("two")
def case_three(self): print ("three")
def default(self): print ("default")
# 이 메서드들만 추가하면 메서드 맵을 생성해서 호출한다.
# 단 메서드 이름은 무조건 case_ 로 시작해야 한다.
#=========================================
localMaps = locals()
@classmethod
def generate(cls):
methodMaps = {}
idx = 1
for keyName in cls.localMaps:
if keyName.startswith('case_'):
methodMaps[idx] = keyName
idx += 1
return methodMaps
@classmethod
def dispatch(cls, i, methodMaps):
methodName = methodMaps.get(int(i), "default")
method = getattr(cls, methodName)
return method(cls)
i = int(input("Select a number (1-3): "))
c = PseudoSelectCase() # 파이썬은 인스턴스에서 클래스 메서드 접근이 가능하다.
c.dispatch(i, c.generate())
Select a number (1-3): 1
one
Select a number (1-3): 4
default
# 메서드 이름 map을 작성하지 않아도 되는 유사 select case 구현 #2
from types import *
# 전 버전은 메서드 이름 짓기에 제한이 있었지만 type 비교를 통해 메서드 이름에 제한이 없다.
class PseudoSelectCase:
def case1(self): print ("one")
def case_two(self): print ("two")
def case_3(self): print ("three")
def default(self): print ("default")
# 마지막 분기 메서드는 반드시 default가 되어야 한다.
def generate(self):
methodMaps = {}
idx = 1
for key, val in self.__class__.__dict__.items():
if type(val) == FunctionType:
methodMaps[idx] = key
idx += 1
if str(key) == 'default':
return methodMaps
return methodMaps
def dispatch(self, i, methodMaps):
methodName = methodMaps.get(int(i), "default")
method = getattr(self, methodName)
return method()
i = int(input("Select a number (1-3): "))
c = PseudoSelectCase()
c.dispatch(i, c.generate())
댓글 영역