본문 바로가기
코딩취미/Python

파이썬 3.12 의 'match' 기능 사용 방법 (패턴 매칭 기능)

by 브링블링 2024. 8. 20.
반응형

파이썬 3.12 의 'match'  기능 사용 방법 (패턴 매칭 기능)

파이썬 3.12에서의 match 문은 기존에 도입된 패턴 매칭 기능을 더욱 확장하고 강화한 기능입니다. match 문은 복잡한 조건에 따라 다양한 패턴을 매칭하여 코드를 더 간결하고 가독성 좋게 작성할 수 있게 해줍니다. 이는 특히 여러 가지 케이스에 따라 서로 다른 처리가 필요한 상황에서 매우 유용합니다.

match 문 기본 구조

기본 구조에서 value의 값에 따라 각기 다른 처리가 이루어집니다.

_는 와일드카드로, 어떠한 값이라도 매칭될 수 있는 기본 케이스를 나타냅니다.

def process(value):
    match value:
        case 1:
            print("Matched the integer 1")
        case "hello":
            print("Matched the string 'hello'")
        case [x, y]:
            print(f"Matched a list with two elements: {x}, {y}")
        case _:
            print("Matched nothing specific")

파이썬 3.12에서의 주요 개선 사항

1. Guarded Patterns (조건부 패턴 매칭)

  • 특정 패턴이 매칭될 때 추가적인 조건을 확인할 수 있도록 지원합니다. 이는 보다 세밀한 제어를 가능하게 합니다.
  • 아래코드에서는 data가 {"type": "A", "value": x} 패턴과 일치하고, x가 10보다 클 때만 첫 번째 케이스가 매칭됩니다.
def process(data):
    match data:
        case {"type": "A", "value": x} if x > 10:
            print("Type A with value greater than 10")
        case {"type": "B"}:
            print("Type B")
        case _:
            print("Unknown type or value")

 

2. AS Pattern (패턴의 부분 매칭)

  • 패턴 매칭 중 일부 값을 변수에 할당하여 그 값을 사용하도록 할 수 있습니다.
  • 여기에서는 data가 첫 번째 케이스와 일치하면, 매칭된 전체 데이터를 whole 변수에 저장하고 이를 출력할 수 있습니다.
def process(data):
    match data:
        case {"type": "A", "value": x} as whole:
            print(f"Full data: {whole}, Value: {x}")
        case _:
            print("Unknown data")

 

3. Nested Patterns (중첩된 패턴)

  • 패턴 매칭은 중첩된 구조에서도 사용할 수 있습니다. 복잡한 데이터 구조를 간단히 매칭할 수 있게 됩니다.
  • 중첩된 사전 구조에서도 특정 키와 값을 쉽게 매칭하여 추출할 수 있습니다.
def process(data):
    match data:
        case {"type": "A", "details": {"key": k, "value": v}}:
            print(f"Type A with key: {k} and value: {v}")
        case _:
            print("Unknown pattern")

 

4. Structural Pattern Matching

  • 구조적 패턴 매칭을 통해, 리스트, 튜플, 사전과 같은 데이터 구조를 더 효율적으로 매칭할 수 있습니다.
  • 특정 시퀀스의 구조를 매칭하여 조건에 따라 처리합니다.
def process(sequence):
    match sequence:
        case [1, 2, 3]:
            print("Matched the sequence [1, 2, 3]")
        case [_, _, 3]:
            print("Matched a sequence ending with 3")
        case _:
            print("Did not match any known sequence")
반응형

match 문 사용 시 주의 사항

  1. 패턴 매칭 우선순위:
    • 패턴은 위에서 아래로 순차적으로 평가됩니다. 따라서 더 구체적인 패턴을 위에 배치하고, 보다 일반적인 패턴을 아래에 두는 것이 좋습니다.
  2. 복잡한 데이터 구조의 매칭:
    • match 문을 사용하여 복잡한 데이터 구조를 매칭할 때, 모든 가능한 패턴을 고려하는 것이 중요합니다. 매칭되지 않는 경우에는 _ 와일드카드를 사용하여 기본 케이스를 처리할 수 있습니다.
  3. 매칭 실패:
    • 만약 패턴이 매칭되지 않으면, match 문은 다음 패턴으로 넘어가며, 최종적으로 어느 패턴도 매칭되지 않으면 기본 케이스가 처리됩니다.

match 문의 장점

  • 코드 가독성: 복잡한 조건문을 간결하게 작성할 수 있어 코드의 가독성이 향상됩니다.
  • 유연성: 다양한 데이터 구조를 쉽게 매칭할 수 있어 복잡한 조건 처리에서 유연하게 사용할 수 있습니다.
  • 확장성: 새로운 조건이나 패턴을 쉽게 추가할 수 있어 유지 보수에 유리합니다.

match 사용 예제

request의 구조에 따라 각각 다른 응답을 반환하는 웹 요청 처리 시스템 예제 입니다.

def handle_request(request):
    match request:
        case {"method": "GET", "path": "/"}:
            return "Handle home page"
        case {"method": "POST", "path": "/submit"}:
            return "Handle form submission"
        case {"method": m, "path": p}:
            return f"Unknown path {p} for method {m}"
        case _:
            return "Invalid request"

참고 자료

반응형