【问题标题】:Strange Syntax Parsing Error in Python?Python中奇怪的语法解析错误?
【发布时间】:2010-04-25 14:50:24
【问题描述】:

我在这里遗漏了什么吗?为什么“损坏”部分下的代码不工作?我正在使用 Python 2.6。

#!/usr/bin/env python

def func(a,b,c):
    print a,b,c

#Working: Example #1:

p={'c':3}

func(1,
     b=2,
     c=3,
     )

#Working: Example #2:

func(1,
     b=2,
     **p)

#Broken: Example #3:

func(1,
     b=2,
     **p,
     )

【问题讨论】:

  • 当我在 Python 2.6 下尝试此代码时,我在第 19 行(第二个工作)处遇到语法错误。
  • 谢谢,更正了示例 #2 中的小错字。
  • 还有(并非不重要):你为什么要这个多余的逗号(除了研究这种行为)?
  • 结尾的逗号帮助我的眼睛看到表达式还没有结束。例如,这将有助于很长的线路。另外,我总是在后面加上逗号,以防我想粘贴更多参数而不必修改前一行(尽管这在这种情况下不适用。)

标签: python syntax-error


【解决方案1】:

这是来自grammar的相关位:

arglist: (argument ',')* (argument [',']
                         |'*' test (',' argument)* [',' '**' test] 
                         |'**' test)

此处的第一行允许在不使用 varargs/kwargs 时在最后一个参数后放置一个逗号(这就是您的第一个示例有效的原因)。但是,如果指定了 kwargs 参数,则不允许在其后放置逗号,如第二行和第三行所示。

顺便说一句,语法显示了一个有趣的事情:

这些都是合法的:

f(a=1, b=2, c=3,)
f(*v, a=1, b=2, c=3)

但这不是:

f(*v, a=1, b=2, c=3,)

**kwargs 后面不允许有逗号是有意义的,因为它必须始终是最后一个参数。我不知道为什么语言设计者选择不允许我的最后一个示例 - 也许是疏忽?

【讨论】:

    【解决方案2】:

    Python 通常允许在逗号列表的末尾添加额外的逗号(在参数列表和容器文字中)。这样做的主要目标是使代码生成稍微容易一些(您不必对最后一项进行特殊处理或对单例元组进行双重特殊处理)。

    在语法的定义中,**kwargs被单独拉出,没有额外的可选逗号。据我想象,它对代码生成之类的实际操作没有帮助(**kwargs 永远是最后一件事,所以你不必特殊情况),所以我不知道为什么 Python 会支持它。

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      相关资源
      最近更新 更多