上一篇我們講述了一些我個人看來比較重要的基於Airbnb Javascript規範的注意事項,這一篇我們迴歸到Python,來看一下基於Google的StyleGuide。
首先是全局變量,不論是寫web還是做一些其他的小項目,我都很少使用全局變量這個東西,很多人和我一樣,而谷歌的設計規範也說明了,在一定情況下,我們確實應該儘量避免使用全局變量。很多時候類變量已經完全滿足我們的要求了。
關於列表推導,有時確實會讓你感覺精簡,但有時複雜的列表推導也會讓你一頭霧水,正如我們想的那樣,簡單的推薦使用,複雜的還是老老實實用循環吧:,。
Yes:
result = []
for x in range(10):
for y in range(5):
if x * y > 10:
result.append((x, y))
No:
result = [(x, y) for x in range(10) for y in range(5) if x * y > 10]
lambda函數的使用,總體上是比較模糊的,但是現在越來越多的人並不願意使用這個,包括我自己,谷歌表示你可以在單行代碼中使用,隨便你吧。
對於條件表達式,與列表推導相似,適用於單行函數. 在其他情況下,推薦使用完整的if語句.
因爲不支持重載,谷歌對於默認參數還是鼓勵使用的,只不過要注意不要在函數或方法定義中使用可變對象作爲默認值,這一點在JS中也有類似的共識:
Yes: def foo(a, b=None):
if b is None:
b = []
No: def foo(a, b=[]):
...
No: def foo(a, b=time.time()):
...
對於不要顯性的出現"True"和"False",同樣與JS類似,上文已經提及,在JS中"[]"是True,而在Python,[]毫無疑問是False。
對於一些過時的語言特性,諸如filter(), map()以及reduce(),我們還是不要再去使用了。
對於裝飾器,這是Python相對於其他語言最好用也是最成熟的一部分了,當然是鼓勵大家多多使用。
但是像諸如元類,動態繼承等一些更進一步的高階Python特性,我們就應該謹慎選擇了。,儘量去避免使用。
對於括號,下面所示的是完全沒有必要的,屬於濫用:
No: if (x):
bar()
if not(x):
bar()
return (foo)
對於定義之間的空行,頂級定義之間空兩行, 方法定義之間空一行,同時不要在逗號, 分號, 冒號前面加空格, 但應該在它們後面加,除了句尾之外。
同時有一點我覺得需要大家注意的,不要用空格來垂直對齊多行間的標記,這對維護起來其實是一個巨大的麻煩:
No:
foo = 1000 # comment
long_name = 2 # comment that should not be aligned
dictionary = {
"foo" : 1,
"long_name": 2,
}
對於類,如果一個類不繼承自其它類, 就顯式的從object繼承,嵌套類也一樣。
Yes: class SampleClass(object):
pass
class OuterClass(object):
class InnerClass(object):
pass
class ChildClass(ParentClass):
"""Explicitly inherits from another class already."""
No: class SampleClass:
pass
class OuterClass:
class InnerClass:
pass
接着是和JS相反的,每個導入佔據一行
Yes: import os
import sys
No: import os, sys
最後關於語句的問題,每個語句應該獨佔一行,舉個例子:
No:
if foo: bar(foo)
else: baz(foo)
try: bar(foo)
except ValueError: baz(foo)
try:
bar(foo)
except ValueError: baz(foo)
這樣的方式是不對的,對於if,在沒有else的情況下,我們纔可以允許其歸併到一行中。
簡單說一下Python的類型註釋,在現如今Js都漸漸向Ts邁進的大環境下,動態語言的類型註釋確實是一個大項目的重要問題。對於Python來說,我們雖然只能簡單的註釋一下,但是這樣的寫法在一定程度上也是有幫助的:
def add(x:int, y:int) -> int:
return x + y
典型的上面的demo,大家可以養成這樣的習慣,也可以關注在這方面的一些最新進展,希望能有更加滿足我們需要的解決辦法出現。