[Python-ideas] With clauses for generator expressions
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
>> 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):
>> 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