[Python-3000] Using *a for packing in lists and other places
Terry Reedy
tjreedy at udel.edu
Sun Mar 16 23:20:56 CET 2008
"Thomas Wouters" <thomas at python.org> wrote in message
news:9e804ac0803151513j495be5d8h22bba219148cf491 at mail.gmail.com...
| On Sat, Mar 15, 2008 at 2:58 PM, Terry Reedy <tjreedy at udel.edu> wrote:
|
| >
| > | Also, yielding everything from an iterator:
| > |
| > | >>> def flatten(iterables):
| > | ... for it in iterables:
| > | ... yield *it
| >
| > Following the general rule above for *exp, that would be the same as
yield
| > tuple(it).
|
|
| No. *exp by itself is not valid syntax:
That may be a fact for your patch but not for all possible patches ;-)
| >>> a, b = *c
| File "<stdin>", line 1
| SyntaxError: can use starred expression only as assignment target
|
| It needs something to unpack *into*, in the immediate context.
Ditto.
My main desire is that *iterable have a simple (easily learnable)
consistent meaning. (Part of consistency is having it work the same both
in and out of function calls).
The rule I suggested is 'execute the statement the same *as if* the
iterable items had been written in the code as a comma sequence'. In the
above, the result would be a tuple. (For targets, the meaning is similar:
*x means, in effect, x[0], x[1], etc, with x sized as needed at runtime.)
The fact that the '*' would be redundant in some contexts and therefore
useless should not necessarily make it syntax error in that context.
if bool(e): pass # and
if bool(e) is True: pass
are both allowed even thought equivalent to 'if e: pass'.
More information about the Python-3000
mailing list