[Python] match-case 문, else 절
[Python] match-case 문, else 절
1. 패턴 매칭(Pattern Matching)
C언어의 switch - case 문을 파이썬에서도 쓰고 싶다면? 패턴 매칭을 이용한다.
1-1. match 문과 case 절
|를 사용하여or조건을 걸 수 있다.['quote', x]:'quote'로 시작하는 list를 찾을 수 있다.- 각 조건의 끝 부분에
if로 guard를 추가할 수 있다. case _: 모든 이전 cases에 걸리지 않는 경우를 의미한다.
1-2. OR-패턴 |
|로 구분된 모든 서브 패턴들을 OR-패턴이라 한다.OR-패턴 내의 모든 서브 패턴들은 같은 변수를 사용해야 한다.
그 중 어느 서브 패턴이 match 되든지간에, guard expression과
casebody 내에서 해당 변수를 사용할 수 있음을 보장하기 위해서이다.case절에서의|연산자는__or__special method를 호출하는 것이 아니라, set union이나 integer bitwise-or 같은 연산을 수행한다.서브 패턴 내에서도
|를 사용할 수 있다.
2. for, while, try 문과 else 절
else절을if문뿐만 아니라for,while,try문에서도 사용할 수 있다.
2-1. else 절의 동작
for문for루프가 완료되면 실행된다.break로 중단되는 경우에는 실행되지 않는다.
while문- 조건이
False가 되어while루프가 exit 될 때 실행된다. break로 중단되는 경우에는 실행되지 않는다.
- 조건이
try문try블록에서 exception이 발생하지 않았을 때 실행된다.- 앞선
except절에서는else절에서 발생하는 exception을 handling 하지 않는다.
try문 총 정리1 2 3 4 5 6 7 8
try: 실행할 코드 except: 예외가 발생했을 때 처리하는 코드 else: 예외가 발생하지 않았을 때 실행할 코드 finally: 예외 발생 여부와 상관없이 항상 실행할 코드
exception 혹은
return,break,continue문를 통해 실행이 종료되는 경우에는else절이 실행되지 않는다.
2-2. else의 활용
루프에서의 예시
1 2 3 4 5
for item in my_list: if item.flavor == 'banana': break else: raise ValueError('No banana flavor found!')
try/except블록에서의 예시어디에서 exception이 발생했는지를 명확히 알기 위해서는
try블록 내에는 expected exception을 생성하는 statements만 있어야 한다.다음의 코드에서는 exception이
dangerous_call()과after_call()중 어디에서 발생했는지 명확하게 알 수 없다.1 2 3 4 5
try: dangerous_call() after_call() except OSError: log('OSError...')
따라서 다음처럼 코드를 재구성하면
dangerous_call()에서 발생 가능한 error를 명확히 처리할 수 있으며,try블록 내에서 exception이 발생하지 않았을 때에만after_call()이 실행되도록 명시할 수 있다.1 2 3 4 5 6
try: dangerous_call() except OSError: log('OSError...') else: after_call()
파이썬의 코딩 스타일: EAFP
- Easier to ask for forgiveness than permission. (허락보다 용서가 쉽다.. 😅)
- 우선은 valid 하다고 생각하고 실행한 다음, valid 하지 않다면 exception을 처리하는 스타일이다.
try,except문으로 구현한다.반대되는 개념은 LBYL(Look before you leap)로, pre-condition을
if문를 통해 명시적으로 검사한 후 실행한다.
- 검사(looking) 후 동작(leaping)하므로, 그 사이에 multi-threaded 환경에서 race condition이 발생하면 동작이 실패할 수 있다. 이는 lock이나 EAFP 접근을 통해 해결할 수 있다.
References
- “Fluent Python (2nd Edition)”, Ch18. with, match, and else Blocks
This post is licensed under CC BY 4.0 by the author.

