Terry J. Reedy <tjre...@udel.edu> added the comment:

Thanks. I remember now: the initial iter_exp is evaluated immediately because 
it always *can* be, because it is only evaluated once and can only involve 
'outside' names, whereas the result expression and any conditional expressions 
and further iteration expressions cannot be (evaluated immediately) because in 
general they usually involve the loop_var and are evaluated many times, each 
time with a different value of the loop_var (which are not available until the 
code is run).

The current 3.2 doc more or less says this already, though in fewer words.

To put it another way, the iter_exp either becomes or is treated like a 
parameter default value expression, so that

ge = (result_exp(loop_var) for loop_var in iter_exp)

is like

def __gf__(_it=iter_exp):
    for loop_var in _it:
        yield result_exp(loop_var)
ge = __gf__()
del __gf__

I wonder if something like this should be added to 5.2.8. Generator 
expressions, with that section moved up before the set/list/dict displays 
sections, and with the comprehension grammar included therein.

If one does *not* want the immediately evaluation of the iter_exp (which does 
not normally happen in generator functions) then, again, one should write a 
generator function. 

I guess the real lesson is that in 3.x, while comprehensions (including g.e.'s 
are very similar to nested loops and conditions or generator functions with the 
same, they are not identical in scoping behavior and need to be thought of as 
their own thing and not only as syntactic sugar. This is probably easier for 
people who start with 3.x ;-).

Along that line, here is another replacement for the not-working example 2:

class Foo:
    x = 3
    y = []
    for z in range(5):
        if z < x:
            y.append(z)

print(Foo.y)
# [0, 1, 2]

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue11796>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to