对于单个元素元组,需要使用尾随逗号。
a = ('foo',)
具有多个元素的元组怎么样?似乎尾随逗号是否存在,它们都是有效的。它是否正确?在我看来,使用尾随逗号更容易编辑。这是一种糟糕的编码风格吗?
a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)
答案 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)