[issue3331] Possible inconsistency in behavior of list comprehensions vs. generator expressions
Carl Johnson
report at bugs.python.org
Thu Jul 10 11:38:22 CEST 2008
New submission from Carl Johnson <carl at carlsensei.com>:
Compare the following behaviors:
Python 3.0a5 (r30a5:62856, May 10 2008, 10:34:28)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more
information.
>>> def f(x):
... if x > 5: raise StopIteration
...
>>> [x for x in range(100) if not f(x)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
File "<stdin>", line 2, in f
StopIteration
>>> list(x for x in range(100) if not f(x))
[0, 1, 2, 3, 4, 5]
One might object that the behavior of the list comprehension is
identical to that of a for-loop:
>>> r = []
>>> for x in range(100):
... if not f(x):
... r.append(x)
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in f
StopIteration
However, it can be argued that in Python 3 list comprehensions should be
thought of as "syntatic sugar" for ``list(generator expression)`` not a
for-loop with an accumulator. (This seems to be the motivation for no
longer "leaking" variables from list comprehensions into their enclosing
namespace.)
One interesting question that this raises (for me at least) is whether
the for-loop should also behave like a generator expression. Of course,
the behavior of the generator expression can already be simulated by
writing:
>>> r = []
>>> for x in range(100):
... try:
... if f(x):
... r.append(x)
... except StopIteration:
... break
...
>>> r
[0, 1, 2, 3, 4, 5]
This raises the question, do we need both a ``break`` statement and
``raise StopIteration``? Can the former just be made into syntatic sugar
for the later?
----------
components: Interpreter Core
messages: 69496
nosy: carlj
severity: normal
status: open
title: Possible inconsistency in behavior of list comprehensions vs. generator expressions
type: behavior
versions: Python 3.0
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue3331>
_______________________________________
More information about the Python-bugs-list
mailing list