[Python-3000] Is this a bug with list comprehensions or not?
Terry Reedy
tjreedy at udel.edu
Sat Jul 12 06:09:19 CEST 2008
Nick Coghlan wrote:
> Carl Johnson wrote:
>> Certainly, it's an inconsistency compared to generator expressions,
>> but is it a bug? I know that Python 3000 is making it so that list
>> comprehension variables don't leak anymore, so I take it that the goal
>> is to have them be more similar to generator expressions than not.
>> Then again, maybe there are good reasons for this behavior? My own
>> feeling is that these two cases should behave the same way, but I
>> could be wrong.
>
> Comprehensions and generator expressions in Py3k are more similar than
> they are in 2.x, but they still aren't identical.
>
> [x for x in range(10) if f(x)] is shorthand for:
>
> def _f(itr):
> _[1] = []
> for x in itr:
> if f(x):
> _[1].append(x)
> return _[1]
> expr_result = _f(range(10))
>
> While (x for x in range(10) if f(x)) is shorthand for:
>
> def _g(itr):
> for x in itr:
> if f(x):
> yield x
> expr_result = _g(range(10))
>
> From those expansions, I think it's pretty clear that the implicit
> generator function in the second case is going to swallow the
> StopIteration and treat it as the end of the iteration process, but no
> such thing is going to happen with the implicit standard function in the
> list comprehension case.
The idea I had, and which is what I believe Adam Olsen posted, is to
augment the genexp to
def _g(itr):
try:
for x in itr:
if f(x):
yield x
except StopIteration: # possibly add 'as si'
raise RuntimeError(<msg>) # <msg> might incorporate si msg
To me, it is more important that list(genexp) == corresponding_listcomp
than that the definition of genexp be minimal.
tjr
More information about the Python-3000
mailing list