[Python-Dev] PEP 340: Else clause for block statements

Guido van Rossum gvanrossum at gmail.com
Mon May 2 16:57:19 CEST 2005

[Guido, prsenting a use case]
> >   block locking(myLock, timeout=30):
> >       ...code executed with lock held...
> >   else:
> >       ...code executed if lock not acquired...

[Anders Munch]
> A file-closing block function has the same need, as does any block
> function that manages a resource, whose acquisition might fail.
> A surrounding try/except doesn't quite cut it; the problem is that the
> try-clause will then also cover the suite.
> Example:
>     try:
>         in opening('file1') as f1:
>             ...
>             in opening('file2') as f2:
>                 ...
>     except IOError:
>         print "file1 not available, I'll try again later"

I thought of this and several other solutions overnight and didn't lik
any. Finally I realized that this use case is better covered by
letting the generator return an error value:

def opening_w_err(filename):
        f = open(filename)
    except IOError, err:
        yield None, err
            yield f, None

The user can then write:

block opening_w_err(filename) as f, err:
    if f:
        ...code using f...
        ...error handling code using err...

Besides, in many cases it's totally acceptable to put a try/except
block around the entire block-statement, if the exception it catches
is specific enough (like IOError). For example:

    block opening(filename) as f:
        ...code using f...
except IOError, err:
    ...error handling code using err...

So I'm more than ever in favor of keeping the block-statement simple,
i.e. without any additional clauses.

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

More information about the Python-Dev mailing list