[Python-ideas] Fwd: Fwd: Fwd: unpacking generalisations for list comprehension

Steven D'Aprano steve at pearwood.info
Mon Oct 17 19:35:13 EDT 2016


On Mon, Oct 17, 2016 at 11:16:03AM -0700, Brendan Barnwell wrote:

> 	Now, personally, I don't insist on that invariant.  I would 
> 	certainly like to be able to do more general things in a list 
> comprehension, 

I hear you, because I too would like to introduce a variant 
comprehension that uses a while instead of if. So don't think I'm not 
sympathetic. But that's not an option, and given the official position 
on comprehensions, I don't think this should be either.

Officially, list comprehensions are not a replacement for general 
for-loops. Python is not Perl, where we encourage people to write 
one-liners, nor is it Haskell, where everything is an expression. If you 
want to do "more general things", use a real for-loop. Comprehensions 
are targetted at a narrow but important and common set of use-cases.


> and many times I have been irritated by the fact that the 
> one-item-per-loop invariant exists.  I'm not sure whether I'm in favor of 
> this particular syntax, but I'd like to be able to do the kind of things it 
> allows.  But doing them inherently requires breaking the invariant you 
> describe.

That last point is incorrect. You already can do the kind of things this 
thread is about:

    [*t for t in iterable]  # proposed syntax: flatten

can be written as:

    [x for t in iterable for x in t]


If you want to apply a function to each element of t:

    [func(x) for x in [*t for t in iterable]]  # proposed syntax

can be written today:

    [func(x) for t in iterable for x in t]


If you want to apply a function or expression to t first:

    [*func(t) for t in iterable]  # proposed syntax
    [*expression for t in iterable]  # proposed syntax

this too can be written today:

    [x for t in iterable for x in func(t)]
    [x for t in iterable for x in expression]


You might have an opinion on whether it is better to have an explicit 
extra loop (more verbose, but less magical) or special syntax (more 
compact, but more magical), but I don't think this proposal adds 
anything that cannot be done today.




-- 
Steve


More information about the Python-ideas mailing list