为啥解包元组会导致语法错误?
Posted
技术标签:
【中文标题】为啥解包元组会导致语法错误?【英文标题】:Why does unpacking a tuple cause a syntax error?为什么解包元组会导致语法错误? 【发布时间】:2011-04-21 17:02:56 【问题描述】:在 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】:您的括号中似乎多了一层。试试:
temp=self.treemodel.insert(iter,0,mht,False,*bvar)
您的额外括号正在尝试使用*
语法创建一个元组,这是一个语法错误。
【讨论】:
【参考方案2】:如果您想将最后一个参数作为(mnt, False, bvar[0], bvar[1], ...)
的元组传递,您可以使用
temp = self.treemodel.insert(iter, 0, (mht,False)+tuple(bvar) )
扩展调用语法 *b
只能在 Python 3.x 上的 calling functions、function arguments 和 tuple unpacking 中使用。
>>> 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
【讨论】:
对,*
解析运算符不允许创建元组。【参考方案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】:更新:此行为已在 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
【讨论】:
以上是关于为啥解包元组会导致语法错误?的主要内容,如果未能解决你的问题,请参考以下文章
Python 模拟 call_args_list 解包元组以对参数进行断言
为啥“isset($a[0]) 和 unset($a[0]);”导致语法错误?