[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