[Python-Dev] Merging PEP 310 and PEP 340-redux?

Ka-Ping Yee python-dev at zesty.ca
Thu May 12 11:04:14 CEST 2005


On Wed, 11 May 2005, Guido van Rossum wrote:
> [Steven Bethard]
> >     exc = ()
> >     try:
> >         try:
> >             BLOCK1
> >         except:
> >             exc = sys.exc_info()
> >     finally:
> >         stmt_exit(*exc)
> >
> > would this make any of the examples impossible to write?  All you have
> > to do to suppress an exception is to not reraise it in __exit__.
>
> But this use case would contain a trap for the unwary user who is
> writing an __exit__ method -- they have to remember to re-raise an
> exception if it was passed in, but that's easy to forget (and slightly
> tricky since you have to check the arg count or whether the first
> argument is not None).

Then wouldn't it be simplest to separate normal exit from exceptional
exit?  That is, split __exit__ into __except__ and __finally__.  If
__except__ is defined, then it handles the exception, otherwise the
exception is raised normally.

> class locking:
>     def __init__(self, lock): self.lock = lock
>     def __enter__(self): self.lock.acquire()
>     def __exit__(self, *args): self.lock.release()

Having __exit__ take varargs is a signal to me that it mashes together
what really are two different methods.


-- ?!ng


More information about the Python-Dev mailing list