파이썬은 패턴 일치 구문을 얻을 수 있습니다.

Python 언어의 작성자는 마침내 패턴 일치 구문 구문을 Python에 가져올 새로운 제안 인 PEP 622를 검토하고 있습니다. 새로운 패턴 일치 문은 파이썬 프로그래머에게 해결 방법에 의존하지 않고도 구조화 된 데이터를 처리하는보다 표현적인 방법을 제공합니다. 

패턴 일치는 switch/caseC 와 같은 많은 프로그래밍 언어의 공통 기능입니다 . 주어진 변수 또는 표현식의 값을 기반으로 여러 가능한 조치 중 하나를 수행 할 수 있습니다. 파이썬에는 패턴 매칭을위한 네이티브 구문이 없지만 if/elif/else체인이나 사전 조회를 통해 이를 에뮬레이트 할 수있었습니다  .

PEP 622는 match/case구문을 사용하여 여러 종류의 패턴에 대해 표현식을 일치시키는 방법을 제안 합니다.

일치 : 케이스 0 | 1 | 2 : print ( "작은 숫자") 대소 문자 [] | [_] : print ( "짧은 시퀀스") case str () | bytes () : print ( "문자열과 같은 것") case _ : print ( "다른 것")

지원되는 패턴 일치 유형에는 리터럴, 이름, 상수 값, 시퀀스, 매핑 (기본적으로 표현식에 키-값 쌍이 있음), 클래스, 위의 조합 또는 이러한 항목과 조건식이 모두 포함됩니다. 모호하거나 해결할 수없는 일치 항목은 런타임에 예외를 발생시킵니다.

개체는 프로토콜이라는 새로운 프로토콜을 통해 일치 테스트를 처리 할 수 ​​있습니다 __match__. 객체가 __match__메서드를 구현하면 주어진 클래스 패턴과 일치하는지 테스트하고 적절한 응답을 반환하는 데 사용할 수 있습니다.

PEP 622는 또한 정적 유형 검사기가 일치를 확인할 수 있는지 확인할 수 있도록합니다. @sealed클래스 의 새 데코레이터는 해당 클래스의 모든 하위 클래스가 기본 클래스와 동일한 모듈에 정의되어 있음을 유형 검사기에 나타냅니다.

패턴 매칭을 추가하는 이전 PEP (2001 년과 2006 년에 각각 제안 된 PEP 275 및 PEP 3103)는 대중적인 지원 부족으로 인해 거부되었습니다. PEP 3103은 Python 제작자 Guido van Rossum이 초안을 작성했습니다. van Rossum 및 기타 여러 사람이 작성한 새로운 PEP는 단순한 if/elif/else 대체가 아닌 객체 일치를위한 정규식을 제공하는 것을 목표로합니다 . 저자는이 PEP의 많은 측면이 Rust와 Scala에서 패턴 매칭이 작동하는 방식에서 영감을 받았다고 지적합니다. 

이 모든 것이 어떻게 구현 될 것인지는 아직 논의 중입니다. PEP 622에서 제안 된 구현은 if/elif/else체인 과 동일한 바이트 코드 시퀀스를 생성합니다 . 더 큰 switch/case블록은 각각에 포함 된 조건부 논리의 양에 따라 성능이 떨어질 수 case있습니다. 그러나 PEP는 많은 접근 방식과 성능 최적화 (예 : 메모 화)가 여전히 테이블에 있음을 분명히합니다.

PEP가 결국 수락 되더라도 그에 대한 많은 부분이 바뀔 수 있습니다. 문제가 될 수있는 한 가지 문제  는  문에 대한 최종 포괄 절로  case _: 대신 사용하는 것입니다 .  많은 상황에서 임시 변수로 사용되며, 일방적으로 동작을 재정의하는 것은 개발자들에게 방해가 될 수 있습니다.else:switch_