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

Python 개선 제안 한국어 번역

PEP 758 – 괄호 없이 exceptexcept* 표현식 허용

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의 예외 처리 구문에서 괄호를 사용하지 않은 exceptexcept* 블록을 허용할 것을 제안합니다. 현재 여러 예외를 포착할 때는 예외 형식 주위에 괄호가 필요합니다. 이는 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
    ...

예외 처리의 의미 체계는 변경되지 않습니다. 인터프리터는 예외가 괄호로 묶였는지 여부와 관계없이 나열된 예외 중 어느 것이든 포착합니다.

하위 호환성

이 변경은 완전한 하위 호환성을 유지합니다. 괄호를 사용한 exceptexcept* 블록을 사용하는 기존 코드는 모두 수정 없이 계속 작동합니다. 새로운 구문은 추가적인 변경일 뿐이며 기존 코드를 중단하지 않습니다.

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 키워드를 사용할 때 괄호를 사용하지 않는 표현식을 허용하는 방안입니다. 이 특정 형식을 보류하기로 결정한 이유는 어느 쪽인지에 대한 명확한 합의가 없고 양쪽 입장 모두에 합리적인 주장이 있기 때문입니다. 사용자가 이러한 단절을 너무 심각하게 느끼는 경우 나중에 괄호 요구 사항을 제거할 수 있으므로, 가장 안전한 접근 방식은 괄호 요구 사항을 유지하는 것입니다. 반면 이를 제거한 후 사용자가 나쁜 생각이었다고 결정하면 다시 추가하기가 쉽지 않습니다.

각주