[Python-ideas] Change how Generator Expressions handle StopIteration

Steven D'Aprano steve at pearwood.info
Sat Nov 15 07:48:48 CET 2014


On Thu, Nov 13, 2014 at 12:04:52PM -0800, Guido van Rossum wrote:

> Do we need a PEP for this or can we just go ahead? I haven't heard any
> pushback on the basic premise that this is a problem we'd like to fix.

*puts hand up*

I'm not convinced that this is *a problem to be fixed*. At worst it is a 
"gotcha" to be aware of.

The current behaviour is simple to understand: raising StopIteration 
halts the generator, end of story. I'm still not sure that I understand 
what the proposed fix is (a PEP will be good to explain that), but if I 
have understood it correctly, it turns a simple concept like 
"StopIteration halts the generator" into something more complicated: 
some StopIterations will halt the generator, others will be chained to a 
new, unrelated exception.

Judging by the complete lack of questions about this on the tutor and 
python-list mailing lists, the slight difference in behaviour between 
generator expressions and comprehensions is not an issue in practice. 
I've seen people ask about the leakage of variables from comprehensions; 
I've never seen people ask about the different treatment of 
StopIteration.

I have, however, seen people *rely* on that different treatment. E.g. to 
implement a short-circuiting generator expression that exits when a 
condition is reached:

    (expr for x in sequence if cond or stop())

where stop() raises StopIteration and halts the generator. If this 
change goes ahead, it will break code that does this.

Having generator expressions and comprehensions behave exactly the same 
leads to the question, why do we have comprehensions? I guess the answer 
is "historical reasons", but from a pragmatic point of view being able 
to choose between

    [expr for x in sequence]
    list(expr for x in sequence)

depending on how you want StopIteration to be treated may be useful.


-- 
Steven


More information about the Python-ideas mailing list