Python 3.10 업데이트 (match/case)

Python 3.10이 업데이트되면서 변화되거나 추가된 사항들이 있다. 


match / case

패턴 매칭은 C 언어에서 제공하는 switch/case 문과 유사하다. 하지만 패턴이 일치하면 해당 구문을 실행한 후, break 없이도 match문을 빠져나간다. 

a = 50

match a:
    case 50:
        print("50")
    case 100:
        print("100")
    case _:
        print("Nothing")
        
# Output: 50

마지막 case _ 는 일치하는 값이 없을 때, 실행하는 구문이다. 만약 case _ 를 선언하지 않으면 아무 실행 없이 match 문을 종료한다. 

num = 1, 2

match num:
    case x,:
        print(f"{x},")
    case x, y:
        print(f"{x}, {y}")
    case x, y, z:
        print(f"{x}, {y}, {z}")
    case _:
        print("None")

# Output: 1, 2

선언되지 않은 변수를 사용하는 것도 가능하다. 

num = 1, 2, 3, 4

match num:
    case x,:
        print(f"{x},")
    case x, y:
        print(f"{x}, {y}")
    case x, *ys:
        print(x, *ys)
    case _:
        print("None")
        
# Output: 1 2 3 4

언패킹을 사용하는 것도 가능하다. 

letter = 'f'

match letter:
    case ('a'|'b'|'c'):
        print("a or b or c")
    case ('d'|'e'|'f'):
        print("d or e or f")
    case _:
        print("None")
        
# Output: d or e or f

| 를 이용해 or 연산도 사용 가능하다. 

num = 30

match num:
    case i if 0 < i < 10:
        print(i, ": 0 < i < 10")
    case i if 10 < i < 50:
        print(i, ": 10 < i < 50")
    case _:
        print("None")
        
# Output: 30 : 10 < i < 50

if문을 이용해 패턴을 생성할 수도 있다. 


객체의 자료형 선언

def func(para: int | str) -> int | float:
    pass

isinstance(100, int | float)

기존에 Union을 활용해 자료형을 선언하던 것을 | (or) 연산을 활용해 작성할 수 있다.

from typing import TypeAlias

Factors: TypeAlias = list[int]

def func() -> Factors:
    pass

TypeAlias는 사용자가 세부적인 타입을 생성할 수 있도록 한다. 


Context Manager

with (
    open("file_1.txt", "r") as f1,
    open("file_2.txt", "r") as f2,
    open("new_file.txt", "w") as f3,
):
    pass

여러개의 with 구문을 작성할 때 ( )를 이용해 묶어주어야 한다.