2010-10-06 6 views
12

En python, j'ai écrit ceci:Pourquoi cela provoque-t-il une erreur de syntaxe?

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

Je suis en train de développer bvar à l'appel de fonction comme arguments. Mais il retourne,

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

Ce qui vient se produire? Cela devrait être correct, n'est-ce pas?

Répondre

21

Si vous voulez passer le dernier argument en tant que tuple de (mnt, False, bvar[0], bvar[1], ...) vous pouvez utiliser

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

La syntaxe d'appel étendu *b ne peut être utilisé dans calling functions, function arguments et tuple unpacking sur Python 3. X.

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

Le littéral tuple n'est pas dans l'un de ces cas, il provoque donc une erreur de syntaxe.

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

À droite, l'opérateur de résolution '*' n'est pas autorisé à créer des tuples. – AndiDog

0

Vous semblez avoir un niveau supplémentaire de parenthèses. Essayez:

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

Vos parenthèses supplémentaires tentent de créer un tuple en utilisant la syntaxe *, ce qui est une erreur de syntaxe.

2

Non, ce n'est pas correct. L'expansion des paramètres fonctionne uniquement dans les arguments de la fonction, pas dans les tuples.

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

Mise à jour: ce comportement a été corrigé dans Python 3.5.0, voir PEP-0448:

Déballer est proposé d'admis à l'intérieur tuple, liste, ensemble, et affiche dictionnaire:

*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} 
Questions connexes