Почему распаковка кортежа вызывает синтаксическую ошибку? - PullRequest
16 голосов
/ 06 октября 2010

В 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

Что только что произошло? Это должно быть правильно, верно?

Ответы [ 4 ]

37 голосов
/ 28 ноября 2015

Обновление: это поведение было исправлено в 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}
24 голосов
/ 06 октября 2010

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

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

Расширенный синтаксис вызова *b может использоваться только в вызывающих функциях, аргументы функции и распаковка кортежа на Python 3.x.

>>> 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
2 голосов
/ 06 октября 2010

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

>>> 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
0 голосов
/ 06 октября 2010

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

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

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

...