¿Por qué desempaquetar una tupla causa un error de syntax?

En Python, escribí esto:

bvar=mht.get_value() temp=self.treemodel.insert(iter,0,(mht,False,*bvar)) 

Estoy tratando de expandir bvar a la llamada de función como argumentos. Pero luego vuelve:

 File "./unobsoluttreemodel.py", line 65 temp=self.treemodel.insert(iter,0,(mht,False,*bvar)) ^ SyntaxError: invalid syntax 

¿Qué acaba de pasar? Debe ser correcto ¿verdad?

Si desea pasar el último argumento como una tupla de (mnt, False, bvar[0], bvar[1], ...) , puede usar

 temp = self.treemodel.insert(iter, 0, (mht,False)+tuple(bvar) ) 

La syntax de llamada extendida *b solo se puede usar en funciones de llamada , argumentos de función y desempaquetado de tuplas en Python 3.x.

 >>> def f(a, b, *c): print(a, b, c) ... >>> x, *y = range(6) >>> f(*y) 1 2 (3, 4, 5) 

Tuple literal no está en uno de estos casos, por lo que causa un error de syntax.

 >>> (1, *y) File "", line 1 SyntaxError: can use starred expression only as assignment target 

Actualización: este comportamiento se solucionó en Python 3.5.0, consulte PEP-0448 :

Se propone que el desempaque se permita en las pantallas de tuplas, listas, conjuntos y diccionarios:

 *range(4), 4 # (0, 1, 2, 3, 4) [*range(4), 4] # [0, 1, 2, 3, 4] {*range(4), 4} # {0, 1, 2, 3, 4} {'x': 1, **{'y': 2}} # {'x': 1, 'y': 2} 

No no está bien. La expansión de parámetros funciona solo en argumentos de función, no dentro de tuplas.

 >>> def foo(a, b, c): ... print a, b, c ... >>> data = (1, 2, 3) >>> foo(*data) 1 2 3 >>> foo((*data,)) File "", line 1 foo((*data,)) ^ SyntaxError: invalid syntax 

Parece que tienes un nivel extra de paréntesis allí. Tratar:

 temp=self.treemodel.insert(iter,0,mht,False,*bvar) 

Sus paréntesis adicionales están intentando crear una tupla usando la * syntax, que es un error de syntax.