PEP 415 – 예외 속성으로 컨텍스트 억제를 구현합니다.
- Author:
- Benjamin Peterson <benjamin at python.org>
- BDFL-Delegate:
- Alyssa Coghlan
- Status:
- Final
- Type:
- Standards Track
- Created:
- 26-Feb-2012
- Python-Version:
- 3.3
- Post-History:
- 26-Feb-2012
- Replaces:
- 409
- Resolution:
- Python-Dev message
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
PEP 409은 예외 컨텍스트 표시를 명시적으로 억제할 수 있도록 raise exc from None 구문을 지원합니다. 이 PEP는 PEP 409에 이미 구현된 언어 수준의 변경 사항을 유지하지만, 기본 구현 메커니즘을 모든 BaseException 인스턴스를 대상으로 하는 새로운 __suppress_context__ 속성에 기반한 더 간단한 접근 방식으로 대체합니다.
PEP 승인
이 PEP는 2012년 5월 14일에 Alyssa Coghlan이 승인했습니다.
근거
PEP 409은 기본적으로 __cause__를 Ellipsis로 변경합니다. 그런 다음 raise exc from None에 의해 __cause__가 None으로 설정되면, 예외가 처리되지 않을 경우 컨텍스트나 원인이 출력되지 않습니다.
이 방식의 주요 문제는 __cause__의 역할을 복잡하게 만든다는 점입니다. __cause__는 예외의 원인을 나타내야 하며, __context__를 출력할지 여부를 나타내서는 안 됩니다. 또한 __cause__의 이러한 사용 방식은 향후 쉽게 확장할 수 없습니다. 예를 들어 언젠가는 프로그래머가 __context__와 __cause__중 어느 것을 출력할지 선택하도록 허용할 수 있습니다. 이러한 요구에는 PEP 409 구현이 적합하지 않습니다.
Ellipsis를 사용하는 것은 임시방편입니다. Ellipsis는 PEP 409 이전에 확장 슬라이싱에서만 독점적으로 사용되었습니다. 확장 슬라이싱은 예외와 아무런 관련이 없으므로, 예외 객체를 살펴보는 사람이 __cause__를 Ellipsis로 설정해야 하는 이유를 명확히 알기 어렵습니다. __cause__에 기본적으로 Ellipsis를 사용하는 것은 __context__와 비대칭을 이룹니다.
제안
BaseException에 새로운 속성인 __suppress_context__를 도입합니다. __cause__가 설정될 때마다 __suppress_context__는 True로 설정됩니다. 특히 raise exc from cause 구문은 exc.__suppress_context__를 True로 설정합니다. 예외 출력 코드는 해당 속성을 확인하여 컨텍스트와 원인을 출력할지 결정합니다. __cause__는 원래의 목적과 값으로 돌아갑니다.
print_line_and_file 예외 속성에는 __suppress_context__에 대한 전례가 있습니다.
요약하면 raise exc from cause는 다음과 동등합니다.:
exc.__cause__ = cause
raise exc
여기서 exc.__cause__ = cause는 exc.__suppress_context__를 암묵적으로 설정합니다.
패치
Issue 14133에 패치가 있습니다.
참고 자료
Copyright
This document has been placed in the public domain.