[Python-ideas] With clauses for generator expressions

Terry Reedy tjreedy at udel.edu
Thu Nov 15 18:54:49 CET 2012


On 11/15/2012 6:11 AM, Andrew Barnert wrote:
>> From: Phil Connell <pconnell at gmail.com>

>> While this  looks very clean, how do you propose the following should be
>> written
>> as a  generator expression?
>>
>> def foo():
>>      with open('foo') as  f:
>>          for line in f:
>>               if 'bar' in line:
>>                   yield line
>
> Exactly as you suggest (quoting you out of order to make the answer clearer):
>
>> (line
>> for line in f
>> if bar in 'line'
>> with open('foo') as f)

The simple rule for comprehensions is that the append (l.c.) or yield 
(g.e) is moved from last to first and the other statements/clauses are 
left in the same order.

> Which means the only question is, which one looks more readable:
>
> 1. (foo(line) for line in baz(f) if 'bar' in line with open('foo') as f)
> 2. (foo(line) for line in baz(f) with open('foo') as f if 'bar' in line)
> 3. (foo(line) with open('foo') as f for line in baz(f) if 'bar' in line)

Which means that 3 is the proper one. In particular, if with clauses 
were added, f must be defined in the with clause before used in the for 
clause, just as line must be defined in the for clause before used in 
the if clause.

-- 
Terry Jan Reedy




More information about the Python-ideas mailing list