【问题标题】: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

刚刚发生了什么?应该是对的吧?

【问题讨论】:

    标签: python arguments tuples


    【解决方案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 functionsfunction argumentstuple 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}
        

        【讨论】:

          猜你喜欢
          • 2015-08-02
          • 1970-01-01
          • 2012-05-14
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 2015-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多