2010-10-06 15 views
12

in Python, ho scritto questo:Perché questo causa un errore di sintassi?

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

sto cercando di espandere bvar alla chiamata di funzione come argomenti. Ma poi tornare,

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

Cosa capita? Dovrebbe essere corretto, giusto?

risposta

21

Se si desidera passare l'ultimo argomento come una tupla di (mnt, False, bvar[0], bvar[1], ...) si potrebbe usare

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

La sintassi di chiamata estesa *b può essere utilizzato solo in calling functions, function arguments, e tuple unpacking su Python 3. X.

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

Tuple letteral non è in uno di questi casi, quindi causa un errore di sintassi.

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

A destra, l'operatore di risoluzione '*' non è autorizzato per la creazione di tuple. – AndiDog

0

Sembra che ci sia un ulteriore livello di parentesi. Prova:

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

vostri parentesi in più stanno cercando di creare una tupla utilizzando la * sintassi, che è un errore di sintassi.

2

Non è giusto. L'espansione dei parametri funziona solo con argomenti di funzione, non all'interno di tuple.

>>> 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

Update: questo comportamento è stato fissato in Python 3.5.0, vedi PEP-0448:

Apertura della confezione si propone di essere ammessi all'interno tuple, elenco, impostare, e visualizza del dizionario:

*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} 
Problemi correlati