[Python-ideas] with statement: multiple context manager

Christian Heimes lists at cheimes.de
Sun Mar 1 14:49:03 CET 2009


Hello fellow Pythonistas!

On a regularly basis I'm bothered and annoyed by the fact that the with
statement takes only one context manager. Often I need to open two files
to read from one and write to the other. I propose to modify the with
statement to accept multiple context manangers.

Example
=======

The nested block::

  with lock:
      with open(infile) as fin:
          with open(outfile, 'w') as fout:
              fout.write(fin.read())


could be written as::

  with lock, open(infile) as fin, open(outfile, 'w') as fout:
      fout.write(fin.read())


The context managers' __enter__() and __exit__() methods are called FILO
(first in, last out). When an exception is raised by the __enter__()
method, the right handed context managers are omitted.

Grammar
=======

I'm not sure if I got the grammar right but I *think* the new grammar
should look like::

with_stmt: 'with' with_vars ':' suite
with_var: test ['as' expr]
with_vars: with_var (',' with_var)* [',']


Christian




More information about the Python-ideas mailing list