为啥列表中允许使用尾随逗号?

Posted

技术标签:

【中文标题】为啥列表中允许使用尾随逗号?【英文标题】:Why are trailing commas allowed in a list?为什么列表中允许使用尾随逗号? 【发布时间】:2012-07-20 19:48:23 【问题描述】:

我很好奇为什么在 Python 中列表中的尾随逗号是有效的语法,而 Python 似乎只是忽略了它:

>>> ['a','b',]
['a', 'b']

这是一个元组,因为('a')('a',) 是两个不同的东西,但是在列表中?

【问题讨论】:

***.com/questions/7992559/… C、C++、Java、javascript 等的列表中也允许使用逗号。 【参考方案1】:

主要优点是它使多行列表更易于编辑,并且减少了差异中的混乱。

变化:

s = ['manny',
     'mo',
     'jack',
]

到:

s = ['manny',
     'mo',
     'jack',
     'roger',
]

只涉及 diff 中的一行更改:

  s = ['manny',
       'mo',
       'jack',
+      'roger',
  ]

这比省略尾随逗号时更令人困惑的多行差异:

  s = ['manny',
       'mo',
-      'jack'
+      'jack',
+      'roger'
  ]

后一种差异使我们更难看出只添加了一行,而另一行没有改变内容。

这也降低了这样做的风险:

s = ['manny',
     'mo',
     'jack'
     'roger'  # Added this line, but forgot to add a comma on the previous line
]

并触发implicit string literal concatenation,产生s = ['manny', 'mo', 'jackroger'],而不是预期的结果。

【讨论】:

这是(最)有道理的,但如果该语言的解析器旨在使差异变得更容易,我真的会感到惊讶。 @BurhanKhalid:语言设计师是程序员,程序员做了很多事情来让他们的生活更轻松。 @Burhan 如果您不相信这种解释,那么以这种方式定义语法也更简单如何? ;) 比较 List = "[" Item "," "]".List = "[" (Item","Item|)"]". 这也使得其他程序更容易自动生成代码 - 为每个项目打印 "\"item\"," 比为每个项目打印 "\"item\"" 后跟 "," 更容易除了最后一项。 @Voo 我也这么认为,但无论如何都必须定义后一种语法,因为它仍然是一个有效的 Python 列表。【参考方案2】:

允许在数组中使用尾随逗号是一种常见的语法约定,C 和 Java 等语言允许这样做,Python 似乎已将这种约定用于其列表数据结构。它在生成填充列表的代码时特别有用:只需生成一系列元素和逗号,无需将最后一个视为特殊情况,末尾不应有逗号。

【讨论】:

【参考方案3】:

它有助于消除某种错误。有时在多行上编写列表会更清晰。 但在以后的维护中,您可能需要重新排列这些项目。

l1 = [
        1,
        2,
        3,
        4,
        5
]

# Now you want to rearrange

l1 = [
        1,
        2,
        3,
        5
        4,
]

# Now you have an error

但如果您允许尾随逗号并使用它们,您可以轻松地重新排列行而不会引入错误。

【讨论】:

这很简洁,但您可以通过在逗号前面添加来避免这种情况。我在编写 SQL 时一直这样做 即使你在每个元素前面加上逗号,你仍然必须在第一个元素上省略逗号。 linter 应该可以捕捉到这个,不是吗?【参考方案4】:

元组不同,因为('a') 使用隐式延续和()s 作为优先运算符进行扩展,而('a',) 指的是长度为1 的元组。

你原来的例子是tuple('a')

【讨论】:

('a'), 是一个字符串;但我的观点是元组中的尾随逗号很重要,但在列表中它们似乎还没有被 Python 接受。 它们在两种情况下都会被默默地丢弃,只是在元组中需要将它与括号中的字符串区分开来。 tuple('a') 可能是一个不好的例子,因为通常tuple(x)(x,) 不是同一个东西。 tuple('ab') != ('ab',)tuple('a') == ('a',) 只是因为 'a' 是长度为 1 的字符串。 来自 REPL:>>> ("a",) == ("a") False >>> ("ab",) == ("ab") False >>> ("ab", "bc",) == ("ab", "bc") True【参考方案5】:

主要原因是让 diff 变得不那么复杂。 例如你有一个列表:

list = [
    'a',
    'b',
    'c'
]

并且您想向其中添加另一个元素。然后你最终会这样做:

list = [
    'a',
    'b',
    'c',
    'd'
]

因此,diff 将显示两行已更改,首先添加','与'c'一致,并在最后一行添加'd'。

因此,python 允许在列表的最后一个元素中使用尾随 ',',以防止可能导致混淆的额外差异。

【讨论】:

以上是关于为啥列表中允许使用尾随逗号?的主要内容,如果未能解决你的问题,请参考以下文章

主键中允许 NULL - 为啥以及在哪个 DBMS 中?

为啥是 ”。” Access中的查询字段名称中允许但表字段名称中不允许?

为啥在未计算的操作数中不允许使用 lambda 表达式,但在常量表达式的未计算部分中允许使用 lambda 表达式?

为啥在 python 切片中允许非整数内置类型?

为啥在 JavaScript 的 IF 语句中允许重新声明变量

sklearn 功能列表中允许的数据类型?