引言
一直都覺得好的代碼風格就像是好看的電腦桌面,一定要簡潔並且遵循一定的規范,之前寫代碼一直覺得有些隨意,這樣很不好,於是整理了一些實用的規范,以后盡量寫一下好的代碼。
在Python開發中,也有不同的編程風格規范,和C/C++開發的編程規范一樣,Google的編程規范,詳細細節參見:
PEP8規范
命名規范
Names to Avoid 應避免的名字
-
永遠不要使用字母‘l’(小寫的L),‘O’(大寫的O),或者‘I’(大寫的I)作為單字符變量名。
-
在有些字體里,這些字符無法和數字0和1區分,如果想用‘l’,用‘L’代替。
Class Names 類名
-
類名一般使用首字母大寫的約定。
-
在接口被文檔化並且主要被用於調用的情況下,可以使用函數的命名風格代替。
-
注意,對於內置的變量命名有一個單獨的約定:大部分內置變量是單個單詞(或者兩個單詞連接在一起),首字母大寫的命名法只用於異常名或者內部的常量。
Function Names 函數名
-
函數名應該小寫,如果想提高可讀性可以用下划線分隔。
-
大小寫混合僅在為了兼容原來主要以大小寫混合風格的情況下使用(比如 threading.py),保持向后兼容性。
Function and method arguments 函數和方法參數
-
始終要將 self 作為實例方法的的第一個參數。
-
始終要將 cls 作為類靜態方法的第一個參數。
-
如果函數的參數名和已有的關鍵詞沖突,在最后加單一下划線比縮寫或隨意拼寫更好。因此 class_ 比 clss 更好。(也許最好用同義詞來避免這種沖突)
編程建議
-
代碼應該用不損害其他Python實現的方式去編寫(PyPy,Jython,IronPython,Cython,Psyco 等)。 比如,不要依賴於在CPython中高效的內置字符連接語句 a += b 或者 a = a + b。這種優化甚至在CPython中都是脆弱的(它只適用於某些類型)並且沒有出現在不使用引用計數的實現中。在性能要求比較高的庫中,可以種 ”.join() 代替。這可以確保字符關聯在不同的實現中都可以以線性時間發生。
-
和像None這樣的單例對象進行比較的時候應該始終用 is 或者 is not,永遠不要用等號運算符。
另外,如果你在寫 if x 的時候,請注意你是否表達的意思是 if x is not None。舉個例子,當測試一個默認值為None的變量或者參數是否被設置為其他值的時候。這個其他值應該是在上下文中能成為bool類型false的值。
- 使用 is not 運算符,而不是 not … is 。雖然這兩種表達式在功能上完全相同,但前者更易於閱讀,所以優先考慮。
導入import
- 導入通常在分開的行。
-
導入總是位於文件的頂部,在模塊注釋和文檔字符串之后,在模塊的全局變量與常量之前。
-
導入應該按照以下順序分組:
-
標准庫導入
-
相關第三方庫導入
-
本地應用/庫特定導入
-
你應該在每一組導入之間加入空行。
-
-
推薦使用絕對路徑導入,如果導入系統沒有正確的配置(比如包里的一個目錄在sys.path里的路徑后),使用絕對路徑會更加可讀並且性能更好(至少能提供更好的錯誤信息)。
注釋
-
與代碼相矛盾的注釋比沒有注釋還糟,當代碼更改時,優先更新對應的注釋!
-
注釋應該是完整的句子。如果一個注釋是一個短語或句子,它的第一個單詞應該大寫,除非它是以小寫字母開頭的標識符(永遠不要改變標識符的大小寫!)。
-
如果注釋很短,結尾的句號可以省略。塊注釋一般由完整句子的一個或多個段落組成,並且每句話結束有個句號。
-
在句尾結束的時候應該使用兩個空格。
-
當用英文書寫時,遵循Strunk and White (譯注:《Strunk and White, The Elements of Style》)的書寫風格。
-
在非英語國家的Python程序員,請使用英文寫注釋,除非你120%的確信你的代碼不會被使用其他語言的人閱讀。
Block Comments 塊注釋
-
塊注釋通常適用於跟隨它們的某些(或全部)代碼,並縮進到與代碼相同的級別。塊注釋的每一行開頭使用一個#和一個空格(除非塊注釋內部縮進文本)。
-
塊注釋內部的段落通過只有一個#的空行分隔。
Inline Comments 行內注釋
1.有節制地使用行內注釋。
2.行內注釋是與代碼語句同行的注釋。行內注釋和代碼至少要有兩個空格分隔。注釋由#和一個空格開始。
3.事實上,如果狀態明顯的話,行內注釋是不必要的,反而會分散注意力。
Documentation Strings 文檔字符串
-
要為所有的公共模塊,函數,類以及方法編寫文檔說明。
-
非公共的方法沒有必要,但是應該有一個描述方法具體作用的注釋。這個注釋應該在def那一行之后。
-
PEP 257描述了寫出好的文檔說明相關的約定。特別需要注意的是,多行文檔說明使用的結尾三引號應該自成一行。
- 對於單行的文檔說明,尾部的三引號應該和文檔在同一行。