YOGYUI

Python::구조적 패턴 매칭 - 파이썬에서 switch/case문을?! 본문

Software/Python

Python::구조적 패턴 매칭 - 파이썬에서 switch/case문을?!

요겨 2021. 3. 21. 21:07
반응형

파이썬 3.10에 마침내 C, C++의 switch/case문과 유사한 문법이 추가된다고 한다

 

출처: https://docs.python.org/3.10/whatsnew/3.10.html

 

PEP 634은 구조적 패턴 매칭(Structural Pattern Matching)이라 하여 switch/case문과 유사한 match/case 문법에 대한 내용을 담고 있다

 

해당 내용은 다음 기사에서 최초로 접했다 (3월5일 기사니 꽤 뒷북인 느낌 ㅎㅎ)

www.ciokorea.com/news/185423

 

파이썬 3.10의 새 '패턴 매칭'이 할 수 있는 일

파이썬(Python)은 강력하고 인기가 높지만, 다른 언어에는 있는 플로우 제어(flow control)가 결여되어 있었다. 이는 하나의 값을 가져와, 여러 가능한 조건 중 하나에 대해 명쾌하게 매칭 할 수 있는

www.ciokorea.com

C, C++의 switch/case문과 달리 시퀀스, 매핑, 기본 자료형 및 클래스 객체 등 다양한 종류의 패턴에 대한 조건문을 짤 수 있다는 장점을 가지고 있다

 

Python 3.10.0은 2021년 3월 21일 현재 alpha 6 버전까지 릴리즈되었고, 10월 4일에 최종 버전이 릴리즈될 예정이라고 한다

출처: https://www.python.org/dev/peps/pep-0619/

 

이왕 본 김에 한번쯤은 써봐야되지 않겠나... 싶어서 알파버전(a6)을 한 번 설치해봤다

알파버전 설치 링크: www.python.org/downloads/release/python-3100a6/

 

Python Release Python 3.10.0a6

The official home of the Python Programming Language

www.python.org

허접한 코드를 작성해보자

def getPhoneCode(country: str) -> int:
    match country.lower():
        case "unitedstate":
            return 1
        case "france":
            return 33
        case "spain":
            return 34
        case "japan":
            return 81
        case "southkorea":
            return 82
        case _:
            return -1


if __name__ == '__main__':
    print(getPhoneCode("SouthKorea"))
    print(getPhoneCode("France"))
    print(getPhoneCode("UnitedState"))
    print(getPhoneCode("China"))
In [1]:
Out[1]:
82
33
1
-1

C, C++ switch/case문의 default는 Python match/case문에서는 언더바( _ )로 처리할 수 있는 것 같다

 

다음과 같은 코드도 돌려봤다

def calculator(command: str):
    match command.split(' '):
        case ["add", str_num1, str_num2]:
            n1, n2 = int(str_num1), int(str_num2)
            print(f"{n1} + {n2} = {n1 + n2}")
        case ["sub", str_num1, str_num2]:
            n1, n2 = int(str_num1), int(str_num2)
            print(f"{n1} - {n2} = {n1 - n2}")
        case ["abs", str_num1]:
            n1 = int(str_num1)
            print(f"|{n1}| = {abs(n1)}")
        case _:
            print("Unknown Command")


if __name__ == '__main__':
    calculator("add 1 2")
    calculator("sub 4 3")
    calculator("abs -5")
    calculator("div 6 3")
In [2]:
Out[2]:
1 + 2 = 3
4 - 3 = 1
|-5| = 5
Unknown Command

 

이런 식으로 함수 반환값에 대한 패턴 일치 여부 조건 분기를 할 수 있다

 

단순히 상수 비교에 대한 분기문이라면 if/elif/else 문에 비해서 그다지 코드가 깔끔해진다던가하는 느낌은 못받았지만, 다음과 같이 객체 타입 비교 등 (특히 객체 패턴에 대한 분기)에 활용하면 코드 가독성을 확실히 높일 수 있지 않을까라는 기대를 할 수 있다

출처: https://www.ciokorea.com/news/185423

매칭 순서는 구체적(복잡한)인 매칭을 우선 처리하고 일반적(단순한)인 매칭은 나중에 처리하는 방식으로 구성해야 효과적이라고 한다

 

정식버전 출시되기까지 6달 정도 남았는데, 틈틈히 평소에 짜뒀던 코드 중에 match/case 문으로 변환했을 때 더 효과적일 구문이 있을까 고민해보면 재밌을 것 같다

반응형