Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

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

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain or CC0-1.0, whichever is more permissive 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

Important

This PEP is a historical document. The up-to-date, canonical documentation can now be found at The try statement.

×

See PEP 1 for how to propose changes.

초록

이 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 블록을 허용하기로 한 결정은 다음 사항들을 고려한 것입니다:

  1. 단순성: 괄호 요구 사항을 제거하면 문법이 단순해지고, 언어의 다른 부분과 더 일관성을 갖추게 됩니다.
  2. 가독성: 많은 예외를 잡는 경우, 괄호를 없애면 시각적 혼잡이 줄어들어 가독성이 높아질 수 있습니다.
  3. 일관성: 이 변경은 모호하지 않은 쉼표 구분 목록에 괄호가 필요하지 않은 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 파서를 수정하고, 새 문법이 괄호 있는 버전과 동일하게 동작하도록 보장합니다.

기각된 아이디어

  1. 괄호 있는 문법과 괄호 없는 문법의 혼용 허용:
    try:
        ...
    except (ValueError, TypeError), OSError:
       ...
    

    이 방안은 혼란을 일으킬 가능성이 있고 두 스타일 간의 명확한 구분을 유지하기 위해 거부되었습니다.

보류된 아이디어

  1. as 키워드를 사용할 때 괄호 없는 표현식을 허용하는 방안. 이 특정 형태를 보류하기로 한 이유는 다음과 같습니다. 어느 쪽으로도 명확한 합의가 없고 두 입장 모두 타당한 논거(인자)가 있으므로, 가장 안전한 접근 방식은 괄호 요구 사항을 유지하는 것입니다. 사용자들이 이 불일치를 지나치게 심하다고 느낀다면 나중에 요구 사항을 제거할 수 있지만, 요구 사항을 없앤 뒤 사용자들이 나쁜 아이디어였다고 판단하더라도 다시 되돌리기는 쉽지 않습니다.

각주