元组定义中尾随逗号的语法规则是什么?
- 2024-12-13 08:36:00
- admin 原创
- 159
问题描述:
对于单元素元组的情况,尾随逗号是必需的。
a = ('foo',)
那么包含多个元素的元组呢?似乎无论尾随逗号是否存在,它们都是有效的。这是正确的吗?在我看来,尾随逗号更容易编辑。这是一种糟糕的编码风格吗?
a = ('foo1', 'foo2')
b = ('foo1', 'foo2',)
解决方案 1:
仅对于单项元组来说,需要消除定义元组或括号内的表达式的歧义。
(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,
)
请注意,这也适用于其他集合(例如列表和字典),而不仅仅是元组。
解决方案 2:
除了空元组之外,在所有情况下,逗号都是重要的。只有在出于其他语法原因需要时才需要使用括号:将元组与一组函数参数、运算符优先级区分开来,或者允许换行。
元组、列表或函数参数的尾随逗号是一种很好的风格,尤其是当您有较长的初始化且分为多行时。如果您始终包含尾随逗号,那么您就不会在末尾添加另一行以期望添加另一个元素,而是只需创建一个有效的表达式:
a = [
"a",
"b"
"c"
]
假设一开始是一个 2 元素列表,后来进行了扩展,那么它就出现了可能不太明显的问题。始终包含尾随逗号,这样就可以避免这个陷阱。
解决方案 3:
尾随逗号的另一个优点是它使差异看起来更美观。如果你开始使用
a = [
1,
2,
3
]
并将其改为
a = [
1,
2,
3,
4
]
差异看起来像
a = [
1,
2,
- 3
+ 3,
+ 4
]
而如果你以逗号开头,比如
a = [
1,
2,
3,
]
那么 diff 就是
a = [
1,
2,
3,
+ 4,
]
解决方案 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'))
解决方案 6:
这是一个简单的答案。
a = ("s")
是一个字符串
和
a = ("s",)
是一个具有一个元素的元组。
如果有一个元素元组,Python 需要一个额外的逗号来区分字符串和元组。
例如在 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
解决方案 7:
尾随逗号仅适用于单元素元组。较大的元组是否使用尾随逗号是风格问题,并非必需。其最大优点是可以清晰显示经常修改的多行大型元组文件(例如配置元组)的差异。
解决方案 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)
如果不允许使用尾随逗号,则必须对最后一个参数进行特殊处理。事实上,您可以使用列表推导将上述内容写成一行(我将其写得更长,以便于阅读)。如果您必须对最后一个术语进行特殊处理,那么这样做就不那么容易了。
解决方案 9:
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,)
解决方案 10:
编码风格是您的品味,如果您认为编码标准很重要,那么PEP-8可以指导您。
您认为以下表达式的结果如何?
x = (3)
x = (3+2)
x = 2*(3+2)
是的,x 只是一个数字。
扫码咨询,免费领取项目管理大礼包!