[Python-Dev] PEP 343 - Abstract Block Redux

Fredrik Lundh fredrik at pythonware.com
Sat May 14 13:55:13 CEST 2005


Nick Coghlan wrote:

> I think the key benefit relates to the fact that correctly written resource
> management code currently has to be split it into two pieces - the first piece
> before the try block (e.g. 'lock.acquire()', 'f = open()'), and the latter in
> the finally clause (e.g. 'lock.release()', 'f.close()').
>
> PEP 343 (like PEP 310 before it) makes it possible to define the correct
> resource management *once*, and then invoke it via a 'with' (or 'do')
> statement.

sure, but even if you look at both the application code *and*
the resource management, there are no clues that the "with"
statement is really just a masked "try/finally" statement.  just
look at the generator example:

    acquire
    yield
    release

what in this snippet tells you that the "release" part will run even if
the external block raises an exception?  you could at least change
that to

    acquire
    try:
        yield
    finally:
        release

which would make it a lot more obvious what's going on here.

also, come to think of it, adding a new statement just to hide
try/finally statements is a waste of statement space.  why not
just enhance the existing try statement?  let

    try with opening(file) as f:
        body
    except IOError:
        deal with the error (you have to do this anyway)

behave like

    try:
        f = opening(file)
        try:
            try:
                body
            except:
                exc = sys.exc_info()
            else:
                exc = None
        finally:
            f.__cleanup__(exc)
    except IOError:
        deal with the error

and you're done.  (or you could use __enter__ and __exit__ instead,
which would give you a variation of PEP-343-as-I-understand-it)

compared to a separate statement, the worst that can happen here,
usage-wise, is that you'll end up adding an "except: raise" line here
and there to propagate real exceptions rather than dealing with them
in place.  on the other hand, for the cases where you actually want
to deal with the exceptions, you'll save a line of code.  I think that's
a net win.

but I still think that something closer to the original PEP 340 is a lot
more useful.

</F>





More information about the Python-Dev mailing list