元组定义中尾随逗号的语法规则是什么?

2024-12-13 08:36:00
admin
原创
159
摘要:问题描述:对于单元素元组的情况,尾随逗号是必需的。a = ('foo',) 那么包含多个元素的元组呢?似乎无论尾随逗号是否存在,它们都是有效的。这是正确的吗?在我看来,尾随逗号更容易编辑。这是一种糟糕的编码风格吗?a = ('foo1', 'foo2') b = ('foo1', 'foo2',) 解决方案 ...

问题描述:

对于单元素元组的情况,尾随逗号是必需的。

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 只是一个数字。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2545  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1551  
  建筑工程全生命周期涉及从项目规划、设计、施工到运营维护等多个复杂阶段,每个阶段都产生和依赖大量信息。PLM(产品生命周期管理)系统作为一种整合数据、流程和人员的数字化解决方案,正逐渐成为建筑行业实现高效协同与可持续发展的关键支撑。通过数字化转型,PLM系统能够优化各阶段的工作流程,提升项目整体质量和效率,为建筑工程的全...
plm是什么软件   1  
  产品生命周期管理(PLM)系统在企业资源成本率优化方面发挥着至关重要的作用。通过构建有效的数据模型,PLM系统能够整合企业各个环节的数据,为资源成本的精准分析和优化提供有力支持。这不仅有助于企业降低成本,还能提升产品质量和市场竞争力。PLM系统概述PLM系统是一种用于管理产品从概念设计到退役全生命周期过程中所有信息和流...
PLM项目管理软件   1  
  产品生命周期管理(PLM)系统在现代企业的产品研发、生产与管理过程中扮演着至关重要的角色。它整合了从产品概念设计到产品退役的全生命周期数据与流程,助力企业提升效率、降低成本并增强创新能力。随着技术的不断发展,到 2025 年,PLM 系统将具备一系列核心功能模块,这些模块将深度影响企业的运营与发展。产品数据管理模块产品...
plm是什么意思   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用