如何寫出符合 Python 審美的程式碼風格?
每個人都有自己的程式碼風格,隨著寫的行數增加,自己對於程式碼的審美也會變的不一樣,這就像是一個逐漸蛻變的過程,每過一段時間回頭再去看看自己之前寫的程式碼就會生出一種「這麼醜的玩意兒竟然是我寫的」這種感慨。
之前不論是寫 C 或者是 C++ 的時候,對於程式碼風格的好壞觀感完全是憑著自己的主觀意識,也沒有什麼官方標準說這樣那樣就是好看的。等學了 Python 以後,神奇的發現 Python 官方竟然給出了一種編碼規範 PEP 8,當然這個只是個標準而已,並沒有強制要求大家都要去遵守,但又好像大多數人都使用了 PEP 8 編碼風格,使它已經成為了事實上的程式碼風格標準。
PEP 8 編碼規範
Python 程式碼從第一眼看上去,給人的感覺就是簡潔優美,可讀性強,也就是我們日常所說的「高顏值」。一方面是因為 Python 自身的優秀設計,比如統一的鎖進,沒有多餘的符號從而讓程式碼變的更加簡潔;另一方面就是因為它有著一套較為統一的編碼風格,當然它本身只是編碼風格方面的建議而不是強制,相應的在編寫 Python 程式碼的編輯器自動提供 PFP 8 檢查,當你編寫的程式碼違反了 PEP 8 規範的時候,會給出警告資訊和修正的建議。與此同時,還有專門的檢查工具對 Python 的程式碼風格進行檢查。
由上,還是建議在編寫 Python 程式碼的時候都遵循 PEP 8 編碼規範,畢竟你以後不可能是隻一個人寫程式碼,未來不論是在公司或者某些開源專案中,作為其中的一份子,肯定還是要在風格上向大眾看齊的。
PEP 8 編碼規範詳細的給出了 Python 編碼的指導,包括什麼對齊啦,包的匯入順序啦,空格和註釋啦還有命名習慣等方方面面,並且還有詳細的事例。
下面我以「包」的匯入為例,看一下 PEP 8 給出的具體程式設計指導。在 Python 中, import 應該一次只匯入一個模組,不同的模組應該獨立一行:
import pandasimport numpy
反面例子:
import pandas,numpy
如果想要從一個模組裡面匯入多個,也可以像下面這樣:
from subprocess import Popen, PIPE
import 語句應該處於原始碼檔案的頂部,位於模組註釋和文件字串之後,全域性變數和常量之前。在匯入不同的庫的時候,應該按照以下的順序分組,各個分組之間以空行分隔:
匯入標準庫模組匯入相關第三方庫模組匯入當前應用程式/庫模組
具體事例如下所示:
import osimport timeimport psutilfrom test import u_test,my_test
Python 中還支援相對匯入和絕對匯入,在這裡還是強推絕對匯入。因為絕對匯入的可讀性更好一些,也不容易出錯,即使出錯了也會給出更加詳細的錯誤資訊。具體如下所示:
from sub_package import toolsfrom sub_package.tools import msg
當然除了上述以外還有更多對於包的規範的描述,PEP 8 的編碼風格指導比較長,並且寫的非常詳細,所以我就不在這一一介紹了,詳細的可以參考 Python 官網上的資料。
pycodestyle 檢查程式碼規範
我在上面說過 PEP 8 只是官方給出的 Python 編碼規範,並沒有強制要求大家都遵守,但是又由於大家都在用,所以它也就變成了事實上的 Python 程式碼風格標準,既然都是標準了,那麼就應該有工具來檢查這個標準,這樣可以幫助 Python 小白規範自己的程式碼,也可以幫助大家在開源或者工作中形成統一的程式碼風格。
為了達成上述的目的,官方提供了同名的命令列工具來檢查 Python 程式碼是否違反了 PEP 8 規範,並且對違反規範的地方給出了相應的提示資訊。
pip install pep8
規範的名字是 PEP 8 ,這個檢查程式碼風格的命令列工具叫 pep8,這個很容易引起大家的困惑,因此 Python 之父建議將 pep8 重新命名為 pycodestyle,下面我們來看一下 pycodestyle 的用法。
首先通過 pip 安裝一下:
pip install pycodestyle
對一個或者多個檔案執行 pycodestyle,列印檢查報告:
通過 --show-source 顯示不符合規範的原始碼,以便程式設計師進行修改,具體如下所示:
autopep8 格式化程式碼
autopep8 能夠將 Python 程式碼自動格式化為 PEP 8 風格,它使用 pycodestyle 工具來決定程式碼中的哪部分需要被格式化,這能夠修復大部分 pycodestyle 工具中報告的排版問題。autopep8 本身也是一個用 Python 寫的工具,所以我們還是可以用 pip 直接安裝:
pip install autopep8
它的使用方式也很簡單,具體如下所示:
autopep8 --in-place test_search.py
上述程式碼如果不帶 --in-place 的話,會將 autopep8 格式化以後的程式碼直接輸出到控制檯。我們可以用這種方式檢查 autopep8 的修改,使用 --in-place 則會直接將結果儲存到原始檔中。在這我繼續用上面的例子中用到的 py 檔案,具體如下所示:
上面的例子中,autopep8 順利的修復了所有的問題,但是如果你這個時候檢視原始檔的話,你會發現原始檔的內容還是和原來一樣,並沒有被修改。這個時候我們就要用到 --in-place,加上這個選項將不會有任何輸出, autopep8 會直接修改原始檔。
autopep8 --in-place test_search.py