比較全的資料
比較需要注意的
縮進(jìn)
每一級縮進(jìn)使用4個空格。
續(xù)行應(yīng)該與其包裹元素對齊,要么使用圓括號、方括號和花括號內(nèi)的隱式行連接來垂直對齊,要么使用掛行縮進(jìn)對齊3。當(dāng)使用掛行縮進(jìn)時,應(yīng)該考慮到第一行不應(yīng)該有參數(shù),以及使用縮進(jìn)以區(qū)分自己是續(xù)行。
推薦:
# 與左括號對齊
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 用更多的縮進(jìn)來與其他行區(qū)分
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
# 掛行縮進(jìn)應(yīng)該再換一行
foo = long_function_name(
var_one, var_two,
var_three, var_four)
- 不推薦:
# 沒有使用垂直對齊時,禁止把參數(shù)放在第一行
foo = long_function_name(var_one, var_two,
var_three, var_four)
# 當(dāng)縮進(jìn)沒有與其他行區(qū)分時,要增加縮進(jìn)
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)
行的最大長度
所有行限制的最大字符數(shù)為79。
沒有結(jié)構(gòu)化限制的大塊文本(文檔字符或者注釋),每行的最大字符數(shù)限制在72。
空行
頂層函數(shù)和類的定義,前后用兩個空行隔開。
類里的方法定義用一個空行隔開。
Imports 導(dǎo)入
- 導(dǎo)入通常在分開的行,例如:
推薦: import os
import sys
不推薦: import sys, os
也可以:
from subprocess import Popen, PIPE
導(dǎo)入總是位于文件的頂部,在模塊注釋和文檔字符串之后,在模塊的全局變量與常量之前。
-
導(dǎo)入應(yīng)該按照以下順序分組:
標(biāo)準(zhǔn)庫導(dǎo)入
相關(guān)第三方庫導(dǎo)入
本地應(yīng)用/庫特定導(dǎo)入
你應(yīng)該在每一組導(dǎo)入之間加入空行。
推薦使用絕對路徑導(dǎo)入,如果導(dǎo)入系統(tǒng)沒有正確的配置(比如包里的一個目錄在sys.path里的路徑后),使用絕對路徑會更加可讀并且性能更好(至少能提供更好的錯誤信息):
Comments 注釋
與代碼相矛盾的注釋比沒有注釋還糟,當(dāng)代碼更改時,優(yōu)先更新對應(yīng)的注釋!
注釋應(yīng)該是完整的句子。如果一個注釋是一個短語或句子,它的第一個單詞應(yīng)該大寫,除非它是以小寫字母開頭的標(biāo)識符(永遠(yuǎn)不要改變標(biāo)識符的大小寫!)。
如果注釋很短,結(jié)尾的句號可以省略。塊注釋一般由完整句子的一個或多個段落組成,并且每句話結(jié)束有個句號。
在句尾結(jié)束的時候應(yīng)該使用兩個空格。
當(dāng)用英文書寫時,遵循Strunk and White (譯注:《Strunk and White, The Elements of Style》)的書寫風(fēng)格。
在非英語國家的Python程序員,請使用英文寫注釋,除非你120%的確信你的代碼不會被使用其他語言的人閱讀。
Block Comments 塊注釋
塊注釋通常適用于跟隨它們的某些(或全部)代碼,并縮進(jìn)到與代碼相同的級別。塊注釋的每一行開頭使用一個#和一個空格(除非塊注釋內(nèi)部縮進(jìn)文本)。
塊注釋內(nèi)部的段落通過只有一個#的空行分隔。
Inline Comments 行內(nèi)注釋
1.有節(jié)制地使用行內(nèi)注釋。
2.行內(nèi)注釋是與代碼語句同行的注釋。行內(nèi)注釋和代碼至少要有兩個空格分隔。注釋由#和一個空格開始。
- 事實上,如果狀態(tài)明顯的話,行內(nèi)注釋是不必要的,反而會分散注意力。比如說下面這樣就不需要:
x = x + 1 # Increment x
但有時,這樣做很有用:
x = x + 1 # Compensate for border
Documentation Strings 文檔字符串
要為所有的公共模塊,函數(shù),類以及方法編寫文檔說明。
非公共的方法沒有必要,但是應(yīng)該有一個描述方法具體作用的注釋。這個注釋應(yīng)該在def那一行之后。
PEP 257描述了寫出好的文檔說明相關(guān)的約定。特別需要注意的是,多行文檔說明使用的結(jié)尾三引號應(yīng)該自成一行,例如:
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
- 對于單行的文檔說明,尾部的三引號應(yīng)該和文檔在同一行。
約定俗成的命名約定
Names to Avoid 應(yīng)避免的名字
永遠(yuǎn)不要使用字母‘l’(小寫的L),‘O’(大寫的O),或者‘I’(大寫的I)作為單字符變量名。
在有些字體里,這些字符無法和數(shù)字0和1區(qū)分,如果想用‘l’,用‘L’代替。
Class Names 類名
類名一般使用首字母大寫的約定。
在接口被文檔化并且主要被用于調(diào)用的情況下,可以使用函數(shù)的命名風(fēng)格代替。
注意,對于內(nèi)置的變量命名有一個單獨的約定:大部分內(nèi)置變量是單個單詞(或者兩個單詞連接在一起),首字母大寫的命名法只用于異常名或者內(nèi)部的常量。
Function Names 函數(shù)名
函數(shù)名應(yīng)該小寫,如果想提高可讀性可以用下劃線分隔。
大小寫混合僅在為了兼容原來主要以大小寫混合風(fēng)格的情況下使用(比如 threading.py),保持向后兼容性。
Function and method arguments 函數(shù)和方法參數(shù)
始終要將 self 作為實例方法的的第一個參數(shù)。
始終要將 cls 作為類靜態(tài)方法的第一個參數(shù)。
如果函數(shù)的參數(shù)名和已有的關(guān)鍵詞沖突,在最后加單一下劃線比縮寫或隨意拼寫更好。因此 class_ 比 clss 更好。(也許最好用同義詞來避免這種沖突)
Programming Recommendations 編程建議
代碼應(yīng)該用不損害其他Python實現(xiàn)的方式去編寫(PyPy,Jython,IronPython,Cython,Psyco 等)。 比如,不要依賴于在CPython中高效的內(nèi)置字符連接語句 a += b 或者 a = a + b。這種優(yōu)化甚至在CPython中都是脆弱的(它只適用于某些類型)并且沒有出現(xiàn)在不使用引用計數(shù)的實現(xiàn)中。在性能要求比較高的庫中,可以種 ”.join() 代替。這可以確保字符關(guān)聯(lián)在不同的實現(xiàn)中都可以以線性時間發(fā)生。
和像None這樣的單例對象進(jìn)行比較的時候應(yīng)該始終用 is 或者 is not,永遠(yuǎn)不要用等號運算符。
另外,如果你在寫 if x 的時候,請注意你是否表達(dá)的意思是 if x is not None。舉個例子,當(dāng)測試一個默認(rèn)值為None的變量或者參數(shù)是否被設(shè)置為其他值的時候。這個其他值應(yīng)該是在上下文中能成為bool類型false的值。
- 使用 is not 運算符,而不是 not … is 。雖然這兩種表達(dá)式在功能上完全相同,但前者更易于閱讀,所以優(yōu)先考慮。
推薦:
if foo is not None
不推薦:
if not foo is None: