[Python-ideas] Potential PEP: with/except

Paul Ferrell pflarr at gmail.com
Tue Jan 22 15:11:10 EST 2019

I've found that almost any time I'm writing a 'with' block, it's doing
something that could throw an exception. As a result, each of those
'with' blocks needs to be nested within a 'try' block. Due to the
nature of 'with', it is rarely (if ever) the case that the try block
contains anything other than the with block itself.

As a result, I would like to propose that the syntax for 'with' blocks
be changed such that they can be accompanied by 'except', 'finally',
and/or 'else' blocks as per a standard 'try' block. These would handle
exceptions that occur in the 'with' block, including the execution of
the applicable __enter__ and __exit__ methods.


    with open(path) as myfile:
      ...   # Do stuff with file
except (OSError, IOError) as err:
    logger.error("Failed to read/open file {}: {}".format(path, err)

The above would turn into simply:

with open(path) as myfile:
    ... # Do stuff with file
except (OSError, IOError) as err:

I think this is rather straightforward in meaning and easy to read,
and simplifies some unnecessary nesting. I see this as the natural
evolution of what 'with'
is all about - replacing necessary try-finally blocks with something
more elegant. We just didn't include the 'except' portion.

I'm a bit hesitant to put this out there. I'm not worried about it
getting shot down - that's kind of the point here. I'm just pretty
strongly against to unnecessary syntactical additions to the language.
This though, I think I can except. It introduces no new concepts and
requires no special knowledge to use. There's no question about what
is going on when you read it.

Paul Ferrell
pflarr at gmail.com

More information about the Python-ideas mailing list