상세 컨텐츠

본문 제목

select case 구문의 구현

Python

by techbard 2021. 5. 16. 19:31

본문

반응형

# 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())
반응형

관련글 더보기

댓글 영역