当你在 Python 中添加或删除列表、字典或集合中的项目时,记住总是将所有行结尾加一个逗号。这是一个非常有用的技巧,可以帮助你避免一些常见的问题。
不确定我所说的什么?让我给你一个快速示例。假设你在代码中有一個名单列表:
>>> names = ['Alice', 'Bob', 'Dilbert']
当你对这个名单列表进行更改时,很难通过 Git diff 等工具来确定哪个项目被修改了。因为大多数源控制系统都是基于行的,而不是基于内容的。
为了解决这个问题,你可以将列表、字典或集合常量分割成多行,如下所示:
>>> names = [
... 'Alice',
... 'Bob',
... 'Dilbert'
... ]
这样,每个项目都在单独的一行上,使得你可以很容易地确定哪个项目被添加、删除或修改了。
但是,当你添加新的项目到列表的结尾时,或者删除最后一个项目时,你需要手动更新逗号放置以获取一致的格式。这可能会引起一些混乱。
例如,如果你想添加一个新的名字(Jane)到这个名单中,你需要在 Dilbert 行后加一个逗号:
>>> names = [
... 'Alice',
... 'Bob',
... 'Dilbert' # <-- 缺失逗号!
... 'Jane'
... ]
当你检查列表的内容时,准备接受一个“惊喜”:
>>> names
['Alice', 'Bob', 'DilbertJane']
是的,如你所见,Python 将 Dilbert 和 Jane 两个字符串合并成 DilbertJane。这个所谓“字符串字面连接”(string literal concatenation)是 Python 的习惯性语法行为,并且在某些情况下非常有用。但是在其他情况下,它可能会引起一些难以捕捉的错误。
诚然,字符串字面连接在某些情况下是一个有用的特性。例如,你可以使用它减少必要的反斜杠分隔一个长的跨行字符串:
my_str = ('This is a super long string constant '
'spread out across multiple lines. '
'And look, no backslash characters needed!')
'This is a super long string constant spread out across multiple lines. And look, no backslash characters needed!'
那么如何修正这样的情形?
在Dilbert后面添加一个逗号,防止两个字符串合并成一个。
>>> names = [
... 'Alice',
... 'Bob',
... 'Dilbert', # 添加一个逗号
... 'Jane'
... ]
现在我们走了一圈回到最初的问题。我不得不调整为两行为了在列表里增加一个新名字。这样很难看懂是某人添加了一个新名字?还是某人改变Dilbert的名字?
幸运的是,Python的语法一劳永逸地解决了逗号放置的问题。你只需养成一个编码风格,避免它在首位置。你把逗号放在在列表、字典或者集合常量的最后一项的后面。这样,你只需记住一条:永远用逗号结尾。如下面的例子:
>>> names = [
'Alice',
'Bob',
'Dilbert', # 逗号结尾
你看到了Dilbert后面的句号吗?这样可以方便地添加或移除新项目而不必更改句子结构位置。它保持了代码行的一致性,使你的源控清晰,并使得代码看着舒服。有时候神奇就在简单的小事上体现,是不?