當你在 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后面的句號嗎?這樣可以方便地添加或移除新項目而不必更改句子結構位置。它保持了代碼行的一致性,使你的源控清晰,并使得代碼看著舒服。有時候神奇就在簡單的小事上體現,是不?