如果是单个元素元组,则必须使用逗号结尾。

a = ('foo',)


具有多个元素的元组怎么办?似乎尾随逗号是否存在,它们都有效。这个对吗?在我看来,尾随逗号更易于编辑。那是不好的编码风格吗?

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


评论

这是语法规则:docs.python.org/reference/expressions.html#expression-lists

#1 楼

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

元组,列表或函数参数的尾部逗号是个好风格,尤其是当您有一个长初始化且分为多行时。如果始终包含尾随逗号,则不会在末尾添加其他行,而希望添加其他元素,而只是创建一个有效的表达式:

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


从2元素列表开始,后来进行了扩展,但它以可能不是立即显而易见的方式出现了问题。始终添加结尾逗号,可以避免使用此陷阱。

评论


由于上述原因,使用逗号分隔可能是有利的。另一方面,如果您还在应用程序中的其他地方处理JavaScript或JSON,则养成这种习惯可能会导致头痛,因为某些浏览器在那里不喜欢它。

– Cito
2011年11月3日,12:07



是的,但是,您永远不应该手工构造JSON,这样就没关系了,对于Javascript,请始终使用jslint或类似方法在接近浏览器之前捕获此类错误。

–邓肯
2011年11月3日,12:15

#2 楼

对于单项元组,只需要将定义元组或用括号括起来的表达式消除歧义即可。

(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指出这对除元组以外的其他内容也有效。这对于拥有一个键非常有用:值,每行,并且在添加新内容时不打逗号。

–乔尔
2011年11月3日,12:24

#3 楼

尾随逗号的另一个优点是,它使差异看起来更好。如果您以

a = [
    1,
    2,
    3
]


开头,然后将其更改为

a = [
    1,
    2,
    3,
    4
]


diff会像

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


如果您以逗号开头,例如

a = [
    1,
    2,
    3,
]


那么区别就是/>
 a = [
     1,
     2,
     3,
+    4,
 ]


评论


这确实是对原始问题的回答,而不是对原始问题的答案,但我真的很喜欢添加的论点,以尾随逗号开头。

–疯狂物理学家
17年4月21日在20:02

#4 楼

它是可选的:请参阅Python Wiki。

摘要:单元素元组需要结尾逗号,但对于多元素元组则是可选的。

#5 楼

另外,请考虑所需的情况:

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


评论


不要以为这个答案与问题有关,而不是对元组的滥用。如果我们期望重复元素为元组类型,则可以将此单元的类型显式声明为单元素元组。与列表相同,请尝试['x','y'] * 4,[['x','y']] * 4,(['x','y'],)* 4

–郭
8月14日11:55



#6 楼

仅尾元素元组才需要尾随逗号。对于较大的元组,请使用逗号作为结尾,这是样式问题,并非必需。它的最大优点是可以清除带有经常修改的多行大元组的文件的差异(例如配置元组)。

#7 楼

这是一个简单的答案。

a =(“ s”)是字符串



a =(“ s”,)是一个字符串具有一个元素的元组。

如果需要一个元素元组,Python需要附加逗号,以区分字符串和元组。

例如,在python控制台上尝试以下操作:

a =(“ s”)

a = a +(1,2,3)

跟踪(最近一次通话为最后一次通话):

模块中的文件stdin,第1行

TypeError:无法连接“ str”和“ tuple”对象

#8 楼

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


如果不允许尾部逗号,则可以在特殊情况下,最后一个参数。实际上,您可以使用列表理解将上述内容写在一行中(我将其写得更长一些,以便于阅读)。如果上学期不得不特殊情况,要做到这一点并非易事。

评论


不需要特殊使用最后一个参数,在这种情况下,可以只使用join:def __repr __(self):'obj('+','.join([repr(arg)for obj.args中的arg ])+')'。

– SuzanneDupéron
13年9月25日在21:19

它也有助于代码生成,甚至可以使用不是用Python编写的工具,也不能使用诸如join之类的漂亮功能。

– asmeurer
2013年9月26日上午1:03

#9 楼

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

尾随逗号通常是可选的,除了在组成一个元素的元组时它们是强制性的(在Python 2中,它们对于打印声明)。为了清楚起见,建议将后者括在(技术上多余的)括号中。

是:

FILES = ('setup.cfg',)


好,但令人困惑:

FILES = 'setup.cfg',


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

是:

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


编号:

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


#10 楼

编码风格是您的喜好,如果您认为编码标准很重要,那么可以使用PEP-8进行指导。

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

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


是的,x只是一个数字。

评论


那是解释你思路的糟糕方法。显式胜于隐式。

– Guilherme David da Costa
2014年9月22日在21:26