在元组定义中使用尾随逗号的语法规则是什么?

时间:2011-11-03 09:23:47

标签: python syntax tuples

对于单个元素元组,需要使用尾随逗号。

a = ('foo',)

具有多个元素的元组怎么样?似乎尾随逗号是否存在,它们都是有效的。它是否正确?在我看来,使用尾随逗号更容易编辑。这是一种糟糕的编码风格吗?

a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)

10 个答案:

答案 0 :(得分:71)

单项元组只需要消除定义元组或括号括起来的表达式的歧义。

(1)  # the number 1 (the parentheses are wrapping the expression `1`)
(1,) # a 1-tuple holding a number 1

对于多个项目,不再需要它,因为它非常清楚它是一个元组。但是,允许尾随逗号使用多行更容易定义它们。您可以添加到结尾或重新排列项目而不会破坏语法,因为您在事故中遗漏了逗号。

如,

someBigTuple = (
                   0,
                   1,
                   2,
                   3,
                   4,
                   5,
                   6,
                   7,
                   8,
                   9,
                   10,
                   #...
                   10000000000,
               )

请注意,这也适用于其他集合(例如,列表和词典),而不仅仅是元组。

答案 1 :(得分:66)

在除了空元组之外的所有情况下,逗号都是重要的。只有在出于其他语法原因需要时才需要括号:区分元组与一组函数参数,运算符优先级或允许换行符。

元组,列表或函数参数的尾随逗号是很好的样式,尤其是当你有一个很长的初始化分割成多行时。如果你总是包含一个尾随逗号,那么你不会在末尾添加另一行,期望添加另一个元素,而只是创建一个有效的表达式:

a = [
   "a",
   "b"
   "c"
]

假设从一个2元素列表开始后来扩展它可能不是很明显的方式出错了。始终包括尾随逗号并避免陷阱。

答案 2 :(得分:44)

尾随逗号的另一个优点是它使差异看起来更好。如果你开始

a = [
    1,
    2,
    3
]

并将其更改为

a = [
    1,
    2,
    3,
    4
]

差异看起来像

 a = [
     1,
     2,
-    3
+    3,
+    4
 ]

然而,如果你开始使用尾随逗号,比如

a = [
    1,
    2,
    3,
]

然后差异只是

 a = [
     1,
     2,
     3,
+    4,
 ]

答案 3 :(得分:12)

可选:请参阅Python wiki

摘要:单元素元组需要一个尾随逗号,但它是多元素元组的可选

答案 4 :(得分:7)

另外,请考虑您想要的情况:

>>> (('x','y'))*4                         # same as ('x','y')*4
('x', 'y', 'x', 'y', 'x', 'y', 'x', 'y')
#Expected = (('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

因此,在这种情况下,外括号只不过是对括号进行分组。 要使它们成为元组,您需要添加一个尾随逗号。即。

>>> (('x','y'),)*4 
(('x', 'y'), ('x', 'y'), ('x', 'y'), ('x', 'y'))

答案 5 :(得分:6)

仅对单元素元组需要尾随逗号。对大型元组使用尾随逗号是一种风格问题,不是必需的。它的最大优点是具有多行大元组的文件上的干净差异,这些元组经常被修改(例如配置元组)。

答案 6 :(得分:5)

这是一个简单的答案。

a =(“s”)是一个字符串

a =(“s”,)是一个元素的元组。

在一个元素元组的情况下,Python需要额外的逗号,区分字符串和元组。

例如在python控制台上试试这个:

a =(“s”)

a = a +(1,2,3)

追踪(最近一次呼叫最后一次):

文件stdin,第1行,在模块中

TypeError:无法连接'str'和'tuple'对象

答案 7 :(得分:4)

存在的另一个原因是它使代码生成和__repr__函数更容易编写。例如,如果您有一些像obj(arg1, arg2, ..., argn)那样构建的对象,那么您可以将obj.__repr__写为

def __repr__(self):
    l = ['obj(']
    for arg in obj.args: # Suppose obj.args == (arg1, arg2, ..., argn)
        l.append(repr(arg))
        l.append(', ')
    l.append(')')
    return ''.join(l)

如果不允许使用尾随逗号,则必须使用特殊情况作为最后一个参数。实际上,你可以使用列表理解在一行中编写上述内容(我已经写了更长的时间以便于阅读)。如果你在上一学期遇到特殊情况,那就不那么容易了。

答案 8 :(得分:1)

PEP 8 -- Style Guide for Python Code - When to Use Trailing Commas

尾部的逗号通常是可选的,除了在创建一个元素的元组时它们是强制性的(并且在Python 2中,它们具有print语句的语义)。为了清楚起见,建议将后者用(技术上多余的)括号括起来。

是:

FILES = ('setup.cfg',)

好的,但是令人困惑:

FILES = 'setup.cfg',

当尾部的逗号多余时,当使用版本控制系统时,当值,参数或导入项的列表应随时间扩展时,它们通常会很有用。模式是将每个值(等)单独放在一行上,始终添加尾随逗号,并在下一行上添加右括号/括号/括号。但是,在与结束定界符相同的行上使用尾随逗号是没有意义的(在上述单例元组的情况下除外)。

是:

FILES = [
    'setup.cfg',
    'tox.ini',
    ]
initialize(FILES,
           error=True,
           )

否:

FILES = ['setup.cfg', 'tox.ini',]
initialize(FILES, error=True,)

答案 9 :(得分:-4)

编码风格是您的品味,如果您认为编码标准很重要,那么PEP-8可以指导您。

您如何看待以下表达式的结果?

x = (3)
x = (3+2)
x = 2*(3+2)

是的,x只是一个数字。