2010-10-06 14 views
12

en Python, escribí esto:¿Por qué esto causa un error de sintaxis?

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

Estoy tratando de ampliar bvar a la llamada de función como argumentos. Pero entonces se vuelve,

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

Lo que acaba de suceder? Debe ser correcto ¿no?

Respuesta

21

Si desea pasar el último argumento como una tupla de (mnt, False, bvar[0], bvar[1], ...) podría utilizar

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

La sintaxis de llamada extendida *b sólo se puede utilizar en calling functions, function arguments, y tuple unpacking 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 provoca un error de sintaxis.

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

Derecha, el operador de resolución '*' no está permitido para crear tuplas. – AndiDog

0

Parece que tiene un nivel adicional de paréntesis allí. Probar:

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

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

2

No es correcto. La expansión de parámetros solo funciona 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 "<stdin>", line 1 
    foo((*data,)) 
     ^
SyntaxError: invalid syntax 
28

Actualización: este comportamiento se fijó en Python 3.5.0, véase PEP-0448:

desembalaje se propone que se le permita el interior tupla, lista, fijar, y muestra diccionario:

*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} 
Cuestiones relacionadas