[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.

Example:

try:
    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:
    logger.error(...)


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