为啥解包元组会导致语法错误?

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 解包元组以对参数进行断言

为啥在 MySQL 查询中添加 '*' 会导致语法错误?

为啥“isset($a[0]) 和 unset($a[0]);”导致语法错误?

为啥在单个语句中分配动态对象的成员变量会导致 PHP 中的语法错误?

为啥这不是python中的语法错误?

为啥 erlang spawn 函数调用中出现语法错误 - “之前的语法错误:')'”?