Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python: when can I unpack a generator?

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
like image 577
robert king Avatar asked Jun 10 '12 10:06

robert king


3 Answers

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.

like image 80
Sven Marnach Avatar answered Oct 10 '22 10:10

Sven Marnach


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

>>> *f()
SyntaxError: can use starred expression only as assignment target
like image 35
jamylak Avatar answered Oct 10 '22 08:10

jamylak


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.

like image 30
Daniel Roseman Avatar answered Oct 10 '22 09:10

Daniel Roseman