我应该在函数调用中的最后一个参数后添加一个尾随逗号吗?(代码片段)

author author     2022-12-29     108

关键词:

什么是更好的做法?

self.call(1, True, "hi")

要么

self.call(1, True, "hi",)

以下情况如下:

self.call(
    1,
    True,
    "hi"
)

要么

self.call(
    1,
    True,
    "hi",
)

?

在数据结构中添加尾随逗号的原因对我来说很熟悉,但是函数调用呢?

答案

我认为没有技术上的理由可以避免在函数调用中使用逗号,但是有些人可能会发现它们会分散注意力。有些人可能会停下来说:

“嗯,我想知道那真的应该在那儿吗?”

我不愿意称这是一个好处,但是使用尾随逗号和缩进样式的一个效果是在添加参数时使版本控制差异看起来更清晰一些。

例如,这样的函数:

def my_fun(a, b, c=None):
    ...

......这样叫:

my_fun(
    a='abc',
    b=123
)

...然后改为:

my_fun(
    a='abc',
    b=123,
    c='def'
)

在git中生成这个diff:

$ git diff
...
 my_fun(
     a='abc',
-    b=123
+    b=123,
+    c='def'
 )

然而,

my_fun(
    a='abc',
    b=123,
)

变成...

my_fun(
    a='abc',
    b=123,
    c='def',
)

在git中生成这个diff:

$ git diff
...
 my_fun(
     a='abc',
     b=123,
+    c='def',
 )
另一答案

在数据结构中,尾随逗号对于更容易添加项目是“有用的”:

a = [
      1,
      2,
      3,
    ]

更容易改变

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

因为您不必编辑说3,的行。

但是函数调用没有这样的好处,通常不会改变长度。所以我不鼓励使用尾随逗号。

另一答案

我也会留下我的2美分,即使这个帖子已经在这里待了一段时间,它可能会让某人受益:)

PEP8实际上确实说when to use trailing commas,如果你遵循他们的建议(不是强制性的,但绝对推荐),那么可以排除你的第二个单行例子,即:

没有:

self.call(1, True, "hi",)

是:

self.call(
    1,
    True,
    "hi",
)

函数调用中的用法(谨慎使用从不),原因如下:


  • 编码原则之一是函数应该做一件事,而只做一件事。因此,在那里看到一个尾随的逗号,当他们真的不应该时,可能会出现很多问题。通常当你在某个地方看到一个尾随的逗号时,你会希望这个东西随着时间的推移而改变。因此,如果它是一个列表,元组,字典等,它通常表示无论是谁设计它,都是为了在该结构中物理添加或删除或切换行,并且......你没有看到它与函数那么多,或者至少你不应该,如果你这样做,应该考虑更好的设计。
  • 如前所述,一个功能也应该是非常可预测的,你没有设计一个函数同时向月球发送邮件和火箭,并在打电话发送邮件时留下一个逗号,因为谁知道你何时可以发送火箭并且你想要更少杂乱的差异(它只会导致更多的混乱和糟糕的设计)
  • 任意数量的参数(或者甚至是固定的,但是大量的参数)通常表示您要在那里实例化一个对象,或者您正在做多个事情,而当您真正应该做的是将您的设计拆分为创建多个较小的参数时函数,每个都做一件事,因此,不需要尾随逗号。
  • 还要考虑,即使你确实有一个函数,你可以调用多个参数,想想你多久会这样做以及它意味着什么?那么这意味着: 它意味着在调用位置重构代码(可能在另一个函数中,或在模块中或某个地方),因为通常函数的结果存储在变量中,并且您需要使用该新结果,这意味着重构。 如果它不暗示重构那么它意味着函数不返回任何东西,或者它确实返回相同的东西,在这种情况下它意味着它使用调用中传递的额外参数做多个事情,如前所述,不是很理想。 即使您不关心编码原则,并忽略上述内容,这种情况多久会完成一次?如果经常给出答案,那就是另一个糟糕,不稳定的设计实现。如果它不经常(好吧,它本身就应该解决它不应该存在,即使你认为它应该,我认为你的眼睛可以在版本控制差异中承受另外一行,这样你就可以避免在同样分享您项目的人员队伍中引起额外的混淆。

实际用途


  • 跟踪逗号是有道理的,就像你在数据结构中所说的那样,预计会随着时间的推移在物理上发生变化的数据结构,因为如果你在运行时更改它,那么它对编辑器中的任何内容都没有任何意义,除了这个定义可能是一个空结构[] xD
  • 在预期数据结构(列表,字符串,集合,元组等)发生变化(物理上,源代码)的情况下,实际上建议使用尾随逗号并且实际上有用(see the full PEP link,它有用例和建议)

结论:


  • 推荐用于预期物理变化的多行数据结构
  • 很少从不在函数调用中
  • 从不在函数定义中
另一答案

我认为,在这个问题中,同样的原因适用于列表和元组,因为函数参数列表就是这样。

以下是针对该语言(c.f.)的设计决策常见问题解答的引用:

为什么Python在列表和元组的末尾允许使用逗号?

Python允许您在列表,元组和字典的末尾添加一个尾随逗号:

[1, 2, 3,]
('a', 'b', 'c',)
d = 
    "A": [1, 5],
    "B": [6, 7],  # last trailing comma is optional but good style

有几个理由允许这样做。

如果列表,元组或字典的文字值分布在多行中,则更容易添加更多元素,因为您不必记住在上一行中添加逗号。这些行也可以重新排序,而不会产生语法错误。

意外省略逗号会导致难以诊断的错误。例如:

x = [
  "fee",
  "fie"
  "foo",
  "fum"
]

这个列表看起来有四个元素,但它实际上包含三个:“费用”,“fiefoo”和“fum”。始终添加逗号可避免此错误来源。

允许尾随逗号也可以使编程代码生成更容易。

如何在 array.map 中的每个元素之后添加逗号,除了 React JSX 中的最后一个元素

】如何在array.map中的每个元素之后添加逗号,除了ReactJSX中的最后一个元素【英文标题】:Howtoaddacommainarray.mapaftereveryelementexceptlastelementinReactJSX【发布时间】:2018-06-0113:57:00【问题描述】:如何在数组的每个元素之后添加一个尾... 查看详情

JSON 从最后一个对象中删除尾随逗号

】JSON从最后一个对象中删除尾随逗号【英文标题】:JSONRemovetrailiingcommafromlastobject【发布时间】:2016-03-2411:54:41【问题描述】:这个JSON数据被动态插入到我正在处理的模板中。我正在尝试从对象列表中删除尾随逗号。我正在使... 查看详情

数组和对象中的尾随逗号是规范的一部分吗?

】数组和对象中的尾随逗号是规范的一部分吗?【英文标题】:Aretrailingcommasinarraysandobjectspartofthespec?【发布时间】:2011-11-0623:29:20【问题描述】:是JavaScript中的尾随逗号标准,还是大多数浏览器(如Chrome和Firefox)都容忍它们?... 查看详情

数组和对象中的尾随逗号是规范的一部分吗?

】数组和对象中的尾随逗号是规范的一部分吗?【英文标题】:Aretrailingcommasinarraysandobjectspartofthespec?【发布时间】:2011-11-0623:29:20【问题描述】:是JavaScript中的尾随逗号标准,还是大多数浏览器(如Chrome和Firefox)都容忍它们?... 查看详情

为啥在变量名后添加尾随逗号使其成为元组?

】为啥在变量名后添加尾随逗号使其成为元组?【英文标题】:Whydoesaddingatrailingcommaafteravariablenamemakeitatuple?为什么在变量名后添加尾随逗号使其成为元组?【发布时间】:2010-09-2010:43:50【问题描述】:我想知道为什么在变量名... 查看详情

kotlinkotlin中使用lambda表达式替代对象表达式原理分析(尾随lambda-trailinglambda语法|接口对象表达式=接口#函数类型对象)(代码片段)

...ailingLambda语法:满足如下两个条件,可以使用尾随Lambda语法;函数作为参数,并且该函数参数是最后一个参数,那么可以将最后一个参数放在括号外面,括号外使用Lambda表达式作为参数;使用尾随Lambda语法可以使代码更简洁,提高代码可读... 查看详情

kotlinkotlin中使用lambda表达式替代对象表达式原理分析(尾随lambda-trailinglambda语法|接口对象表达式=接口#函数类型对象)

...ailingLambda语法:满足如下两个条件,可以使用尾随Lambda语法;函数作为参数,并且该函数参数是最后一个参数,那么可以将最后一个参数放在括号外面,括号外使用Lambda表达式作为参数;使用尾随Lambda语法可以使代码更简洁,提高代码可读... 查看详情

如何在 Jquery 中多次调用一个函数来添加一个事件监听器而不只是监听最后一个?

】如何在Jquery中多次调用一个函数来添加一个事件监听器而不只是监听最后一个?【英文标题】:HowtocallafunctionmultipletimesinJquerytoaddaneventlistenerwithoutjustlisteningthelastone?【发布时间】:2020-04-0604:34:58【问题描述】:所以我想创建一... 查看详情

R CITATION 文件:在最后一个条目后去掉逗号?

】RCITATION文件:在最后一个条目后去掉逗号?【英文标题】:RCITATIONfile:getridofcommaafterlastentry?【发布时间】:2014-10-2110:01:41【问题描述】:我是R包作者,并且已经编写了一个CITATION文件以包含在包中。但是,当我在R中使用citation... 查看详情

无论我是不是将尾随逗号放入数组中,性能是不是存在差异?

...题描述】:在我读到的ThinkinginJavabook4thedition中,在列表中的最后一个对象之后留下逗号使得自动 查看详情

在R中的两位数后添加逗号?

】在R中的两位数后添加逗号?【英文标题】:AddacommaaftertwodigitsinR?【发布时间】:2021-11-1219:58:08【问题描述】:我想在所有列的数字之间添加一个逗号。我的数据是一个百分比,但它是这样传递的:Percentage34564444325预期值:Perce... 查看详情

makefile之call函数

参考技术Acall函数是唯一一个可以创建定制化参数函数的引用函数。支持对自定义函数的引用;支持将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对它进行展开来获取不同的结果;函数语法:$(callVARIABLE,PARAM,PARAM,...... 查看详情

将多个尾随 qaction 添加到 lineedit

...操作。我查看了qlineeditsc++源代码并构建了一个修改后的函数,该函数添加了自 查看详情

tslint - 最后一行缺少尾随逗号(尾随逗号)

】tslint-最后一行缺少尾随逗号(尾随逗号)【英文标题】:tslint-Missingtrailingcomma(trailing-comma)onthelastline【发布时间】:2019-02-1213:18:54【问题描述】:我不明白为什么我的tslint甚至想在objects的最后一行末尾看到尾随逗号?例如,... 查看详情

删除尾随逗号 - (在问这个之前我做了研究,相信我。)

...:50:41【问题描述】:好吧,在你说什么之前,我已经做了一个小时的研究,没有任何技术在起作用......继续这个问题:我正在使用一个多维数组并尝试在一个数组中回显一个特定品牌的所有汽车模型。我有以下代码:<? 查看详情

如何转换逗号分隔列表中的列数据

...下面是我的数据的外观。第一张图片有错误,最后一个PID应该是1,倒数第二个是2。我需要的是这个,这可以在AdvantageDataba 查看详情

从 SQL Server CE 中的字符串列中删除最后一个字符

】从SQLServerCE中的字符串列中删除最后一个字符【英文标题】:RemovelastcharacterfromstringcolumninSQLServerCE【发布时间】:2013-01-2223:07:12【问题描述】:在SQLServerCompact中,我试图删除一个尾随逗号,该逗号来自一个影响NVARCHAR列的数千... 查看详情

在 Windows 脚本中读取命令行参数时,有没有办法转义逗号字符?

...述】:我正在尝试从命令行读取多个输入参数。最后一个应该是逗号分隔的列表,但脚本只能读取逗号之前的第一个单词。也就是说,当我调用脚本时: 查看详情