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

在单个元素元组的情况下,需要尾随逗号。

a = ('foo',)

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

a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)
Stan asked 2019-08-13T23:36:47Z
10个解决方案
71 votes

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

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

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

Jeff Mercado answered 2019-08-13T23:37:54Z
65 votes

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

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

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

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

Duncan answered 2019-08-13T23:37:14Z
44 votes

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

a = [
    1,
    2,
    3
]

并改为

a = [
    1,
    2,
    3,
    4
]

差异看起来像

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

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

a = [
    1,
    2,
    3,
]

然后差异就是

 a = [
     1,
     2,
     3,
+    4,
 ]
asmeurer answered 2019-08-13T23:38:45Z
12 votes

它是可选的:参见Python wiki。

简介:单元素元组需要一个尾随逗号,但它对于多元素元组是可选的。

Dave Everitt answered 2019-08-13T23:39:16Z
7 votes

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

>>> (('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'))
MaPy answered 2019-08-13T23:39:47Z
6 votes

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

Adam Zalcman answered 2019-08-13T23:40:12Z
4 votes

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

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

asmeurer answered 2019-08-13T23:40:44Z
4 votes

这是一个简单的答案。

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

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

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

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

a =(" s")

a = a +(1,2,3)

Traceback(最近一次调用最后一次):

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

TypeError:无法连接' str' 和'元组'对象

rajni kant answered 2019-08-13T23:42:08Z
1 votes

PEP 8 - 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,)
Uri answered 2019-08-13T23:42:59Z
-4 votes

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

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

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

是的,x只是一个数字。

Melug answered 2019-08-13T23:43:38Z
translate from https://stackoverflow.com:/questions/7992559/what-is-the-syntax-rule-for-having-trailing-commas-in-tuple-definitions