PEP 758 – 괄호 없는 except 및 except* 표현식 허용
- Author:
- Pablo Galindo Salgado <pablogsal at python.org>, Brett Cannon <brett at python.org>
- Status:
- Final
- Type:
- Standards Track
- Created:
- 30-Sep-2024
- Python-Version:
- 3.14
- Post-History:
- 02-Oct-2024
- Resolution:
- 14-Mar-2025
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
이 PEP [1]는 as 절을 사용하지 않는 경우에 한해, Python 예외 처리 문법에서 괄호 없는 except 및 except* 블록을 허용할 것을 제안합니다. 현재는 여러 예외를 잡을 때 예외 타입들을 괄호로 감싸야 합니다. 이는 Python 2의 잔재였습니다. 이 PEP는 이러한 괄호를 생략할 수 있도록 하여 문법을 단순화하고, 괄호를 선택 사항으로 두는 문법의 다른 부분과 더 일관되게 만들며, 특정 경우에 가독성을 높일 것을 제안합니다.
동기
여러 예외를 잡기 위한 현재 문법은 except 표현식에 괄호를 요구합니다(except* 표현식도 마찬가지입니다). 예를 들면 다음과 같습니다:
try:
...
except (ExceptionA, ExceptionB, ExceptionC):
...
이 문법은 명확하고 모호하지 않지만, 경우에 따라, 특히 많은 수의 예외를 잡을 때는 불필요하게 장황하다고 볼 수 있습니다. 괄호 생략을 허용하면 다음과 같이 문법을 단순화할 수 있습니다:
try:
...
except ExceptionA, ExceptionB, ExceptionC:
...
이 변경은 함수 인자, 함수 호출 안의 제너레이터 표현식, 튜플 리터럴처럼 괄호가 선택 사항인 Python의 다른 쉼표 구분 목록과 문법을 더 일치시킵니다.
같은 변경이 except* 표현식에도 적용됩니다. 예를 들면 다음과 같습니다:
try:
...
except* ExceptionA, ExceptionB, ExceptionC:
...
예외 인스턴스를 포착하기 위해 as 절을 사용하는 경우에는 이전과 같이 괄호를 사용해야 합니다. 언어의 다른 부분에서는 비슷한 상황(임포트나 컨텍스트 관리자 등)에서 여러 개의 as 절을 사용할 수 있으므로, 괄호를 요구하지 않으면 대상에 정확히 무엇이 할당되는지 불분명해져 혼란스러울 것이라는 의견을 밝힌 사용자들이 있었습니다. 따라서 앞의 예제에 as 절을 추가한다면 다음과 같이 작성해야 합니다:
try:
...
except (ExceptionA, ExceptionB, ExceptionC) as e:
...
근거
괄호 없는 except 블록을 허용하기로 한 결정은 다음 사항들을 고려한 것입니다:
- 단순성: 괄호 요구 사항을 제거하면 문법이 단순해지고, 언어의 다른 부분과 더 일관성을 갖추게 됩니다.
- 가독성: 많은 예외를 잡는 경우, 괄호를 없애면 시각적 혼잡이 줄어들어 가독성이 높아질 수 있습니다.
- 일관성: 이 변경은 모호하지 않은 쉼표 구분 목록에 괄호가 필요하지 않은 Python의 다른 부분과
except절이 더 일관되도록 합니다.
명세
except 절의 문법은 괄호 없는 예외 타입 목록을 허용하도록 수정됩니다. 문법은 다음과 같이 갱신됩니다:
except_block:
| 'except' expressions ':' block
| 'except' expression 'as' NAME ':' block
| 'except' ':' block
except_star_block
| 'except' '*' expressions ':' block
| 'except' '*' expression 'as' NAME ':' block
이렇게 하면 현재의 괄호 있는 문법과 새로운 괄호 없는 문법을 모두 허용하면서도, as 키워드를 사용할 때는 괄호를 요구하게 됩니다:
try:
...
except (ExceptionA, ExceptionB): # Still valid
...
except ExceptionC, ExceptionD: # New syntax
...
except (ExceptionE, ExceptionF) as e: # Parentheses still required
...
예외 처리의 의미는 변경되지 않습니다. 인터프리터는 괄호로 감쌌는지와 관계없이 나열된 예외 중 어느 것이든 잡습니다.
하위 호환성
이 변경은 완전한 하위 호환성을 유지합니다. 괄호로 감싼 except 및 except* 블록을 사용하는 기존 코드는 모두 수정 없이 계속 동작합니다. 새 문법은 순전히 추가되는 것이며 기존 코드를 전혀 깨뜨리지 않습니다.
Python 2에서는 요소가 두 개인 괄호 없는 문법이 허용되었으나 의미가 달랐다는 점에 주목할 필요가 있습니다. 당시에는 목록의 첫 번째 요소가 예외 타입으로, 두 번째 요소가 캡처 변수로 사용되었습니다. 이 변경은 Python 2의 의미를 다시 도입하지 않으며, 괄호 없는 문법은 괄호 있는 버전과 동일하게 동작합니다.
보안 영향
이 변경으로 인해 알려진 보안 영향은 없습니다. 예외 처리의 의미는 그대로 유지되며, 이는 순전히 구문상의 변경입니다.
교육 방법
Python을 처음 접하는 사용자에게는 괄호 없는 문법을 여러 예외를 잡는 표준 방법으로 가르칠 수 있습니다:
try:
risky_operation()
except ValueError, TypeError, OSError:
handle_errors()
숙련된 사용자에게는 괄호 있는 버전과 서로 바꿔 사용할 수 있는 새로운 선택적 문법으로 소개할 수 있습니다. 문서에는 두 형태가 동등하다는 점을 명시해야 합니다:
# These are equivalent:
except (ValueError, TypeError):
...
except ValueError, TypeError:
...
이는 순전히 구문상의 변경이며 예외 처리의 동작에는 영향을 주지 않는다는 점을 강조해야 합니다.
참조 구현
개념 증명 구현은 https://github.com/pablogsal/cpython/commits/notuples/ 에서 확인할 수 있습니다. 이 구현은 새 문법을 받아들이도록 Python 파서를 수정하고, 새 문법이 괄호 있는 버전과 동일하게 동작하도록 보장합니다.
기각된 아이디어
- 괄호 있는 문법과 괄호 없는 문법의 혼용 허용:
try: ... except (ValueError, TypeError), OSError: ...
이 방안은 혼란을 일으킬 가능성이 있고 두 스타일 간의 명확한 구분을 유지하기 위해 거부되었습니다.
보류된 아이디어
as키워드를 사용할 때 괄호 없는 표현식을 허용하는 방안. 이 특정 형태를 보류하기로 한 이유는 다음과 같습니다. 어느 쪽으로도 명확한 합의가 없고 두 입장 모두 타당한 논거(인자)가 있으므로, 가장 안전한 접근 방식은 괄호 요구 사항을 유지하는 것입니다. 사용자들이 이 불일치를 지나치게 심하다고 느낀다면 나중에 요구 사항을 제거할 수 있지만, 요구 사항을 없앤 뒤 사용자들이 나쁜 아이디어였다고 판단하더라도 다시 되돌리기는 쉽지 않습니다.
각주
Copyright
This document is placed in the public domain or under the CC0-1.0-Universal license, whichever is more permissive.