On 1 Jul 2013 07:01, "Guido van Rossum" <guido@python.org> wrote:
>
> I apologize, this thread was too long for me to follow. Is the issue
> the following?
>
> >>> def stopif(x):
> ... if x: raise StopIteration
> ... return True
> ...
> >>> [i for i in range(10) if stopif(i==3)]
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "<stdin>", line 1, in <listcomp>
> File "<stdin>", line 2, in stopif
> StopIteration
> >>> list(i for i in range(10) if stopif(i==3))
> [0, 1, 2]
>
> I.e. the difference between list(<genexp>) and [<genexp>] is that if
> <genexp> raises StopIteration, list(...) returns the elements up to
> that point but [...] passes the exception out?
>
> That seems a bug to me inherited from the Python 2 implementation of
> list comprehensions and I'm fine with fixing it in 3.4. The intention
> of the changes to comprehensions in Python 3 was that these two forms
> would be completely equivalent. The difficulty has always been that
> CPython comprehensions were traditionally faster than generator
> expressions and we're reluctant to give that up. But it's still a bug.
Yep, and Andrew pointed out the overhead of fixing it is actually quite low - we just have to tweak comprehensions to wrap the entire loop in a try/except that ignores the StopIteration exception. That brings them into line with the generator form where it doesn't matter if the exception comes directly from the generator code or is raised by the interpreter due to the frame terminating, the loop implicit in the list call will treat it as indicating the end of the generator.
Cheers,
Nick.
>
> --
> --Guido van Rossum (python.org/~guido)
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> http://mail.python.org/mailman/listinfo/python-ideas