[Python-Dev] PEP 343 and __with__

Guido van Rossum guido at python.org
Tue Oct 4 16:54:15 CEST 2005


On 10/4/05, Jason Orendorff <jason.orendorff at gmail.com> wrote:
> This:
>
>     with EXPR as VAR:
>         BLOCK
>
> expands to this under PEP 342:
>
>     _cm = contextmanager(EXPR)
>     VAR = _cm.next()
>     try:
>         BLOCK
>     except:
>         try:
>             _cm.throw(*sys.exc_info())
>         except:
>             pass
>         raise
>     finally:
>         try:
>             _cm.next()
>         except StopIteration:
>             pass
>         except:
>             raise
>         else:
>             raise RuntimeError

Where in the world do you get this idea? The translation is as
follows, according to PEP 343:

        abc = EXPR
        exc = (None, None, None)
        VAR = abc.__enter__()
        try:
            try:
                BLOCK
            except:
                exc = sys.exc_info()
                raise
        finally:
            abc.__exit__(*exc)

PEP 342 doesn't touch on the expansion of with-statements at all.

I think I know where you're coming from, but please do us a favor and
don't misrepresent the PEPs.  If anything, your proposal is more
complicated; it requires four new APIs instead of two, and requires an
extra call to set up (__with__() followed by start()).

Proposals like yours (and every other permutation) were brought up
during the initial discussion. We picked one. Don't create more churn
by arguing for a different variant. Spend your efforts on implementing
it so you can actually use it and see how bad it is (I predict it
won't be bad at all).

--
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list