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

对于单个元素元组,需要后面的逗号。

a = ('foo',)

具有多个元素的元组怎么样?似乎不管后面的逗号是否存在,它们都是有效的。是这样吗?在我看来,后面加个逗号更容易编辑。这是一种糟糕的编码风格吗?

a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)
62420 次浏览

只有一个元素元组需要尾随逗号。在较大的元组后面加一个逗号是一个风格问题,不是必需的。它最大的优点是对经常被修改的多行大元组(例如,配置元组)的文件进行清除 diff。

只有单项元组才需要消除定义元组或括号包围的表达式的歧义。

(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,
)

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

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

元组、列表或函数参数的后面的逗号是很好的风格,特别是当你有一个很长的初始化过程被分成多行时。如果你总是在后面加一个逗号,那么你就不会在结尾处再加一行希望添加另一个元素,而只是创建一个有效的表达式:

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

假设一开始是一个2元素列表,后来又扩展了,那么它可能以一种并不明显的方式出错了。总是在后面加逗号,这样就避免了陷阱。

它是可选的: 参见 Python 维基百科

简介: 单元素元组 需要一个后面的逗号,但它是多元素元组 可以选择

编码风格是你的口味,如果你认为编码标准很重要,有一个 PEP-8可以指导你。

你觉得下面这个表达式的结果怎么样?

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

是的,X 只是一个数字。

这样做的另一个原因是,它使代码生成和 __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)

如果不允许使用后面的逗号,那么就必须对最后一个参数进行特殊处理。事实上,你可以用一个列表内涵把上面的内容写在一行里(为了方便阅读,我把它写得更长了)。如果上学期你必须特殊处理的话,就不那么容易做到了。

用逗号结尾的另一个好处是,它使区别看起来更好

a = [
1,
2,
3
]

然后改成了

a = [
1,
2,
3,
4
]

差速器看起来像

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

但是如果你用逗号开头,比如

a = [
1,
2,
3,
]

那么区别就在于

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

答案很简单。

a = ("s")是一个字符串

还有

a = ("s",)是一个只有一个元素的元组。

对于一个元素 tuple,Python 需要一个额外的逗号来区分 string 和 tuple。

例如,在 python 控制台上尝试这样做:

a = ("s")


a  = a + (1,2,3)


Traceback (most recent call last):


File stdin, line 1, in module


TypeError: cannot concatenate 'str' and 'tuple' objects

此外,考虑一下你想要的情况:

>>> (('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'))

PEP8-Python 代码的样式指南-何时使用尾随逗号

后面的逗号通常是可选的,除了在创建由一个元素组成的元组时它们是强制的(在 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,)