Terry J. Reedy <[email protected]> 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 <[email protected]>
<http://bugs.python.org/issue11796>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com