python: when can I unpack a generator?

12,503

Solution 1

The *iterable syntax is only supported in an argument list of a function call (and in function definitions).

In Python 3.x, you can also use it on the left-hand side of an assignment, like this:

[*args] = [1, 2, 3]

Edit: Note that there are plans to support the remaining generalisations.

Solution 2

Running this in Python 3 gives a more descriptive error message.

>>> *f()
SyntaxError: can use starred expression only as assignment target

Solution 3

The two errors are showing the same thing: you can't use * on the left-hand side of an expression.

I'm not sure what you're expecting to happen in those cases, but it's not valid.

Share:
12,503
Rusty Rob
Author by

Rusty Rob

Startups, Entrepreneurship, Ideas, Python, Google App Engine, Javascript, AngularJs, Scalable Web Apps, Mathematics, Go Lang, AI, Google Cloud Platform robert-king.com https://google.com/+RobertKing LinkedIn Quora Twitter

Updated on June 08, 2022

Comments

  • Rusty Rob
    Rusty Rob about 2 years

    How does it work under the hood? I don't understand the reason for the errors below:

    >>> def f():
    ...     yield 1,2
    ...     yield 3,4
    ...
    >>> *f()
      File "<stdin>", line 1
        *f()
        ^
    SyntaxError: invalid syntax
    >>> zip(*f())
    [(1, 3), (2, 4)]
    >>> zip(f())
    [((1, 2),), ((3, 4),)]
    >>> *args = *f()
    File "<stdin>", line 1
      *args = *f()
        ^
    SyntaxError: invalid syntax