[Python-Dev] PEP 415: Implementing PEP 409 differently (original) (raw)

Benjamin Peterson benjamin at python.org
Mon Feb 27 02:30:10 CET 2012


PEP: 415 Title: Implementing PEP 409 differently Version: RevisionRevisionRevision Last-Modified: DateDateDate Author: Benjamin Peterson <benjamin at python.org> Status: Draft Type: Standards Track Content-Type: text/x-rst Created: 26-Feb-2012 Post-History: 26-Feb-2012

Abstract

PEP 409 allows PEP 3134 exception contexts and causes to be suppressed when the exception is printed. This is done using the raise exc from None syntax. This PEP proposes to implement context and cause suppression differently.

Rationale

PEP 409 changes __cause__ to be Ellipsis by default. Then if __cause__ is set to None by raise exc from None, no context or cause will be printed should the exception be uncaught.

The main problem with this scheme is it complicates the role of __cause__. __cause__ should indicate the cause of the exception not whether __context__ should be printed or not. This use of __cause__ is also not easily extended in the future. For example, we may someday want to allow the programmer to select which of __context__ and __cause__ will be printed. The PEP 409 implementation is not amendable to this.

The use of Ellipsis is a hack. Before PEP 409, Ellipsis was used exclusively in extended slicing. Extended slicing has nothing to do with exceptions, so it's not clear to someone inspecting an exception object why __cause__ should be set to Ellipsis. Using Ellipsis by default for __cause__ makes it asymmetrical with __context__.

Proposal

A new attribute on BaseException, __suppress_context__, will be introduced. The raise exc from None syntax will cause exc.__suppress_context__ to be set to True. Exception printing code will check for the attribute to determine whether context and cause will be printed. __cause__ will return to its original purpose and values.

There is precedence for __suppress_context__ with the print_line_and_file exception attribute.

Patches

There is a patch on Issue 14133_.

References

.. _issue 14133: http://bugs.python.org/issue6210

Copyright

This document has been placed in the public domain.



More information about the Python-Dev mailing list