[Python-ideas] with statement syntax forces ugly line breaks?

M.-A. Lemburg mal at egenix.com
Thu Sep 9 15:32:15 CEST 2010


Mark Summerfield wrote:
> Hi,
> 
> I can't see a _nice_ way of splitting a with statement over mulitple
> lines:
> 
> class FakeContext:
>     def __init__(self, name):
>         self.name = name
>     def __enter__(self):
>         print("enter", self.name)
>     def __exit__(self, *args):
>         print("exit", self.name)
> 
> with FakeContext("a") as a, FakeContext("b") as b:
>     pass # works fine
> 
> 
> with FakeContext("a") as a,
>      FakeContext("b") as b:
>     pass # synax error
> 
> 
> with (FakeContext("a") as a,
>       FakeContext("b") as b):
>     pass # synax error
> 
> The use case where this mattered to me was this:
> 
>     with open(args.actual, encoding="utf-8") as afh,
>     open(args.expected, encoding="utf-8") as efh: actual =
>     [line.rstrip("\n\r") for line in afh.readlines()] expected =
>     [line.rstrip("\n\r") for line in efh.readlines()]
> 
> Naturally, I could split the line in an ugly place:
> 
>     with open(args.actual, encoding="utf-8") as afh, open(args.expected,
> 	    encoding="utf-8") as efh:
> 
> but it seems a shame to do so. Or am I missing something?

Why do you need to put everything on one line ?

afh = open(args.actual, encoding="utf-8")
efh = open(args.expected, encoding="utf-8")

with afh, efh:
   ...

In the context of files, the only purpose of the with statement
is to close them when leaving the block.

>>> a = open('/etc/passwd')
>>> b = open('/etc/group')
>>> with a,b: print a.readline(), b.readline()
...
at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/bash
at:!:25:

>>> a
<closed file '/etc/passwd', mode 'r' at 0x7f0093e62390>
>>> b
<closed file '/etc/group', mode 'r' at 0x7f0093e62420>

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Sep 09 2010)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________
2010-08-19: Released mxODBC 3.1.0              http://python.egenix.com/
2010-09-15: DZUG Tagung, Dresden, Germany                   6 days to go

::: Try our new mxODBC.Connect Python Database Interface for free ! ::::


   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611
               http://www.egenix.com/company/contact/



More information about the Python-ideas mailing list