בתאריך יום ו׳, 14 באוק' 2016, 12:19, מאת Michel Desmoulin < desmoulinmichel@gmail.com>:
Regarding all those examples:
Le 14/10/2016 à 00:08, אלעזר a écrit :
Trying to restate the proposal, somewhat more formal following Random832 and Paul's suggestion.
I only speak about the single star. ---
*The suggested change of syntax:*
comprehension ::= starred_expression comp_for
*Semantics:*
(In the following, f(x) must always evaluate to an iterable)
1. List comprehension:
result = [*f(x) for x in iterable if cond]
Translates to
result = [] for x in iterable: if cond: result.extend(f(x))
2. Set comprehension:
result = {*f(x) for x in iterable if cond}
Translates to
result = set() for x in iterable: if cond: result.update(f(x))
Please note that we already have a way to do those. E.G:
result = [*f(x) for x in iterable if cond]
can currently been expressed as:
>>> iterable = range(10) >>> f = lambda x: [x] * x >>> [y for x in iterable if x % 2 == 0 for y in f(x)] [2, 2, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8]
Now I do like the new extension syntax. I find it more natural, and more readable:
>>> [*f(x) for x in iterable if x % 2 == 0]
But it's not a missing feature, it's really just a (rather nice) syntaxic improvement.
It is about lifting restrictions from an existing syntax. That this behavior is being *explicitly disabled* in the implementation is a strong evidence, in my mind. (There are more restrictions I was asked not to divert this thread, which makes sense) Elazar