views:

148

answers:

2

Hi, I am trying to understand how and when iterator expressions get evaluated. The following seems to be a lazy expression:

g = (i for i in range(1000) if i % 3 == i % 2)

This one, however fails on construction:

g = (line.strip() for line in open('xxx', 'r') if len(line) > 10)

I do not have the file named 'xxx'. However, since this thing is lazy, why is it failing so soon?

Thanks.

EDI: Wow, I made a lazy one!

g = (line.strip() for i in range(3) for line in open(str(i), 'r'))
+3  A: 

The iteration over the file returned by the call to open() is lazy. The call to open() is not.

Ignacio Vazquez-Abrams
+3  A: 

From the documentation:

Variables used in the generator expression are evaluated lazily in a separate scope when the next() method is called for the generator object (in the same fashion as for normal generators). However, the in expression of the leftmost for clause is immediately evaluated in the current scope so that an error produced by it can be seen before any other possible error in the code that handles the generator expression.

danben