Python 擁有簡潔優雅的語法,但這並不意味著開發者一定能寫出簡潔而優雅的程式碼。要寫出好的程式碼,就要遵循一定的規則。Python 官方給出了 PEP8 風格指南,建議每位 Python 開發者都應該閱讀一遍,並在開發過程中遵循該程式設計規範。
PEP 8 全稱為 Python Enhancement Proposal #8 , 中文叫做《8號Python增強提案》。PEP 8 中列出了很多程式設計的細節,認真實踐有助於養成良好的程式設計習慣。
PEP 8 官方文件:PEP 8 -- Style Guide for Python Code
PEP 8 概要
下面列出 PEP 8 中提到的,並且每位 Python 開發者都應該遵循的基本要求,段落摘自 Effective Python 中文譯本。
空白
Python 中的空白(whitespace)會影響程式碼的含義。 Python 程式設計師使用空白的時候尤其在意,因為它們還會影響程式碼的清晰程度。
- 使用 space(空格)來表示縮排,而不要用 tab(製表符)。
- 和語法相關的每一層縮排都用 4 個空格來表示。
- 每行的字元數不應超過 79。
- 對於佔據多行的長表示式來說,除了首行之外的其餘各行都應該在通常的縮排級別之上再加 4 個空格。
- 檔案中的函式與類之間應該用兩個空行隔開。
- 在同一個類中,各方法之間應該用一個空行隔開。
- 在使用下標來獲取列表元素、呼叫函式或給關鍵字引數賦值的時候,不要在兩旁新增空格。
- 為變數賦值的時候,賦值符號的左側和右側應該各自寫上一個空格,而且只寫一個就好。
命名
PEP 8 提倡採用不同的命名風格來編寫 Python 程式碼中的各個部分,以便在閱讀程式碼時可以根據這些名稱看出它們在 Python 語言中的角色。
- 函式、變數及屬性應該用小寫字母來拼寫,各單詞之間以下劃線相連,例如,lowercase_underscore。
- 受保護的例項屬性,應該以單個下劃線開頭,例如, _leading_underscore。
- 私有的例項屬性,應該以兩個下劃線開頭,例如, __double_leading_underscore。
- 類與異常,應該以每個單詞首字母均大寫的形式來命名,例如, CapitalizedWord。
- 模組級別的常量,應該全部採用大寫字母來拼寫,各單詞之間以下劃線相連,例如, ALL_CAPS。
- 類中的例項方法(instance method),應該把首個引數命名為 self,以表示該物件自身。
- 類方法(class method)的首個引數,應該命名為 cls,以表示該類自身。
表示式和語句
《The Zen of Python》(Python 之禪)中說:“每件事都應該有直白的做法,而且最好只有一種。” PEP 8 在制定表示式和語句的風格時,就試著體現了這種思想。
- 採用內聯形式的否定詞,而不要把否定詞放在整個表示式的前面,例如,應該寫 if a is not b 而不是 if not a is b。
- 不要通過檢測長度的辦法(如 if len(somelist) == 0)來判斷 somelist 是否為 [] 或 '' 等空值,而是應該採用 if not somelist 這種寫法來判斷,它會假定:空值將自動評估為 False。
- 檢測 somelist 是否為 [1] 或 'hi' 等非空值時,也應如此, if somelist 語句預設會把非空的值判斷為 True。
- 不要編寫單行的 if 語句、 for 迴圈、 while 迴圈及 except 複合語句,而是應該把這些語句分成多行來書寫,以示清晰。
- import 語句應該總是放在檔案開頭。
- 引入模組的時候,總是應該使用絕對名稱,而不應該根據當前模組的路徑來使用相對名稱。例如,引入 bar 包中的 foo 模組時,應該完整地寫出 from bar import foo,而不應該簡寫為 import foo。
- 如果一定要以相對名稱來編寫 import 語句,那就採用明確的寫法: from.import foo。
- 檔案中的那些 import 語句應該按順序劃分成三個部分,分別表示標準庫模組、第三方模組以及自用模組。在每一部分之中,各 import 語句應該按模組的字母順序來排列。
PEP 8 檢測工具
我們可以使用 Johann C. Rocholl 開發的 pep8 程式,來自動檢測程式碼是否符合 PEP8 規範。
通過 pip 來快速安裝該程式:
$ pip install pep8複製程式碼
使用格式
$ pep8 [options] input...複製程式碼
主要引數解釋:
--first
只顯示每一類錯誤中的第一個錯誤--exclude=patterns
指定要排除的檔案或資料夾模式,以逗號分隔--filename=patterns
指定待檢測的檔名模式,預設以逗號分隔--select=errors
指定要檢測的錯誤型別--ignore=errors
指定要忽略的錯誤型別--show-source
顯示每一個錯誤的原始碼--show-pep8
顯示每個錯誤的具體 PEP8 規範(將自動設定--first
)--statistics
對錯誤和警告進行計數--count
將錯誤和警告的總數列印到標準輸出,如果不為零,那麼退出程式碼將會被設為1--max-line-length
設定每行的最大長度,預設為79--format=format
設定錯誤的格式
更詳細的使用介紹,請參考此文件:pep8 documentation