Почему это вызывает синтаксическую ошибку?
В 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
Что происходит? Это должно быть правильно?
Ответы
Ответ 1
Если вы хотите передать последний аргумент как кортеж (mnt, False, bvar[0], bvar[1], ...)
, вы можете использовать
temp = self.treemodel.insert(iter, 0, (mht,False)+tuple(bvar) )
Синтаксис расширенного вызова *b
может использоваться только в вызывающих функциях, аргументы функции и распаковка tuple на 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
Обновление: это поведение было исправлено в 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}
Ответ 3
Не это неправильно. Расширение параметров работает только в аргументах функции, а не внутри кортежей.
>>> 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
Ответ 4
У вас, кажется, есть дополнительный уровень круглых скобок. Попробуйте:
temp=self.treemodel.insert(iter,0,mht,False,*bvar)
Ваши дополнительные круглые скобки пытаются создать кортеж, используя синтаксис *
, который является синтаксической ошибкой.