2010-10-06 3 views
12

В Python, я написал:Почему это вызывает синтаксическую ошибку?

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

Я пытаюсь расширить BVAR для вызова функции в качестве аргументов. Но потом вернуться,

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

Что только случилось? Это должно быть правильно?

ответ

21

Если вы хотите передать последний аргумент, как кортеж (mnt, False, bvar[0], bvar[1], ...) вы могли бы использовать

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

Расширенный синтаксис вызова *b может быть использован только в calling functions, function arguments и tuple unpacking на Python 3. Икс.

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

Литерал кортежа не входит в один из этих случаев, поэтому он вызывает синтаксическую ошибку.

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

Правильно, оператор '*' разрешения не разрешен для создания кортежей. – AndiDog

0

У вас, кажется, есть дополнительный уровень круглых скобок. Попробуйте:

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

Ваши дополнительные скобки пытаются создать кортеж, используя * синтаксис, который является синтаксической ошибкой.

2

Неправильно. Расширение параметров работает только в аргументах функции, а не внутри кортежей.

>>> 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: это поведение было зафиксировано в Python 3.5.0, см PEP-0448:

Распаковка предлагается допускать в кортеже, список, набор, и словарь отображает:

*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} 
Смежные вопросы