关于python:元组周围何时需要括号?

When are parentheses required around a tuple?

当用括号括起来的元组是必需的还是不需要的时候,是否有一个引用精确地定义了?

以下是一个最近让我吃惊的例子:

1
2
3
4
5
6
7
>>> d = {}
>>> d[0,] = 'potato'
>>> if 0, in d:
  File"<stdin>", line 1
    if 0, in d:
        ^
SyntaxError: invalid syntax


使用逗号标记结合表达式来创建元组被称为expression_list。运算符优先规则不包括表达式列表;这是因为表达式列表本身不是表达式;它们在括在括号中时成为表达式。

因此,在python中的任何地方都允许使用未封闭的expression_list,这是语言语法特别允许的,但在需要expression的地方则不允许。

例如,if语句的语法如下:

1
2
3
if_stmt ::= "if" expression":" suite
             ("elif" expression":" suite )*
             ["else"":" suite]

由于引用了生产expression,因此不允许未关闭的expression_lists作为if语句的主题。但是,for语句接受expression_list

1
2
for_stmt ::= "for" target_list"in" expression_list":" suite
              ["else"":" suite]

因此,允许以下内容:

1
2
for x in 1, 2, 3:
    print(x)


在任何允许使用expression_list术语的地方,都不需要使用括号。

if语句需要expression,不支持expression_list

允许使用expression_list的语法示例:

  • return声明
  • yield表达式
  • 分配(包括增援任务)
  • for号声明。

grepping表达式、expression_list的简单和复合语句文档将告诉您在Python语法中使用expression_list的所有位置。


为了避免歧义,还需要括号。

以下是两个不同的表达式…只是因为某个东西是"表达式列表",不会导致您可能期望的表达式列表:)

1
2
(1, 2, 3) + (4, 5) # results in (1, 2, 3, 4, 5) because + does sequence.extend on the tuples
1, 2, 3 + 4, 5     # this results in (1, 2, 7, 5) because + adds the elements, since there were no parentheses to protect the separate tuples