寫在之前
每個(gè)人都有自己的代碼風(fēng)格,隨著寫的行數(shù)增加,自己對(duì)于代碼的審美也會(huì)變的不一樣,這就像是一個(gè)逐漸蛻變的過(guò)程,每過(guò)一段時(shí)間回頭再去看看自己之前寫的代碼就會(huì)生出一種「這么丑的玩意兒竟然是我寫的」這種感慨。
之前不論是寫 C 或者是 C++ 的時(shí)候,對(duì)于代碼風(fēng)格的好壞觀感完全是憑著自己的主觀意識(shí),也沒(méi)有什么官方標(biāo)準(zhǔn)說(shuō)這樣那樣就是好看的。等學(xué)了 Python 以后,神奇的發(fā)現(xiàn) Python 官方竟然給出了一種編碼規(guī)范 PEP 8,當(dāng)然這個(gè)只是個(gè)標(biāo)準(zhǔn)而已,并沒(méi)有強(qiáng)制要求大家都要去遵守,但又好像大多數(shù)人都使用了 PEP 8 編碼風(fēng)格,使它已經(jīng)成為了事實(shí)上的代碼風(fēng)格標(biāo)準(zhǔn)。
PEP 8 編碼規(guī)范
Python 代碼從第一眼看上去,給人的感覺就是簡(jiǎn)潔優(yōu)美,可讀性強(qiáng),也就是我們?nèi)粘Kf(shuō)的「高顏值」。一方面是因?yàn)?Python 自身的優(yōu)秀設(shè)計(jì),比如統(tǒng)一的鎖進(jìn),沒(méi)有多余的符號(hào)從而讓代碼變的更加簡(jiǎn)潔;另一方面就是因?yàn)樗兄惶纵^為統(tǒng)一的編碼風(fēng)格,當(dāng)然它本身只是編碼風(fēng)格方面的建議而不是強(qiáng)制,相應(yīng)的在編寫 Python 代碼的編輯器自動(dòng)提供 PFP 8 檢查,當(dāng)你編寫的代碼違反了 PEP 8 規(guī)范的時(shí)候,會(huì)給出警告信息和修正的建議。與此同時(shí),還有專門的檢查工具對(duì) Python 的代碼風(fēng)格進(jìn)行檢查。
由上,還是建議在編寫 Python 代碼的時(shí)候都遵循 PEP 8 編碼規(guī)范,畢竟你以后不可能是只一個(gè)人寫代碼,未來(lái)不論是在公司或者某些開源項(xiàng)目中,作為其中的一份子,肯定還是要在風(fēng)格上向大眾看齊的。
PEP 8 編碼規(guī)范詳細(xì)的給出了 Python 編碼的指導(dǎo),包括什么對(duì)齊啦,包的導(dǎo)入順序啦,空格和注釋啦還有命名習(xí)慣等方方面面,并且還有詳細(xì)的事例。
下面我以「包」的導(dǎo)入為例,看一下 PEP 8 給出的具體編程指導(dǎo)。在 Python 中, import 應(yīng)該一次只導(dǎo)入一個(gè)模塊,不同的模塊應(yīng)該獨(dú)立一行:
import pandasimport numpy
反面例子:
import pandas,numpy
如果想要從一個(gè)模塊里面導(dǎo)入多個(gè),也可以像下面這樣:
from subprocess import Popen, PIPE
import 語(yǔ)句應(yīng)該處于源碼文件的頂部,位于模塊注釋和文檔字符串之后,全局變量和常量之前。在導(dǎo)入不同的庫(kù)的時(shí)候,應(yīng)該按照以下的順序分組,各個(gè)分組之間以空行分隔:
導(dǎo)入標(biāo)準(zhǔn)庫(kù)模塊
導(dǎo)入相關(guān)第三方庫(kù)模塊
導(dǎo)入當(dāng)前應(yīng)用程序/庫(kù)模塊
具體事例如下所示:
import osimport timeimport psutilfrom test import u_test,my_test
Python 中還支持相對(duì)導(dǎo)入和絕對(duì)導(dǎo)入,在這里還是強(qiáng)推絕對(duì)導(dǎo)入。因?yàn)榻^對(duì)導(dǎo)入的可讀性更好一些,也不容易出錯(cuò),即使出錯(cuò)了也會(huì)給出更加詳細(xì)的錯(cuò)誤信息。具體如下所示:
from sub_package import toolsfrom sub_package.tools import msg
當(dāng)然除了上述以外還有更多對(duì)于包的規(guī)范的描述,PEP 8 的編碼風(fēng)格指導(dǎo)比較長(zhǎng),并且寫的非常詳細(xì),所以我就不在這一一介紹了,詳細(xì)的可以參考 Python 官網(wǎng)上的資料。
pycodestyle 檢查代碼規(guī)范
我在上面說(shuō)過(guò) PEP 8 只是官方給出的 Python 編碼規(guī)范,并沒(méi)有強(qiáng)制要求大家都遵守,但是又由于大家都在用,所以它也就變成了事實(shí)上的 Python 代碼風(fēng)格標(biāo)準(zhǔn),既然都是標(biāo)準(zhǔn)了,那么就應(yīng)該有工具來(lái)檢查這個(gè)標(biāo)準(zhǔn),這樣可以幫助 Python 小白規(guī)范自己的代碼,也可以幫助大家在開源或者工作中形成統(tǒng)一的代碼風(fēng)格。
為了達(dá)成上述的目的,官方提供了同名的命令行工具來(lái)檢查 Python 代碼是否違反了 PEP 8 規(guī)范,并且對(duì)違反規(guī)范的地方給出了相應(yīng)的提示信息。
pip install pep8
規(guī)范的名字是 PEP 8 ,這個(gè)檢查代碼風(fēng)格的命令行工具叫 pep8,這個(gè)很容易引起大家的困惑,因此 Python 之父建議將 pep8 重新命名為 pycodestyle,下面我們來(lái)看一下 pycodestyle 的用法。
首先通過(guò) pip 安裝一下:
pip install pycodestyle
對(duì)一個(gè)或者多個(gè)文件運(yùn)行 pycodestyle,打印檢查報(bào)告:
通過(guò) --show-source 顯示不符合規(guī)范的源碼,以便程序員進(jìn)行修改,具體如下所示:
autopep8 格式化代碼
autopep8 能夠?qū)?Python 代碼自動(dòng)格式化為 PEP 8 風(fēng)格,它使用 pycodestyle 工具來(lái)決定代碼中的哪部分需要被格式化,這能夠修復(fù)大部分 pycodestyle 工具中報(bào)告的排版問(wèn)題。autopep8 本身也是一個(gè)用 Python 寫的工具,所以我們還是可以用 pip 直接安裝:
pip install autopep8
它的使用方式也很簡(jiǎn)單,具體如下所示:
autopep8 --in-place test_search.py
上述代碼如果不帶 --in-place 的話,會(huì)將 autopep8 格式化以后的代碼直接輸出到控制臺(tái)。我們可以用這種方式檢查 autopep8 的修改,使用 --in-place 則會(huì)直接將結(jié)果保存到源文件中。在這我繼續(xù)用上面的例子中用到的 py 文件,具體如下所示:
上面的例子中,autopep8 順利的修復(fù)了所有的問(wèn)題,但是如果你這個(gè)時(shí)候查看源文件的話,你會(huì)發(fā)現(xiàn)源文件的內(nèi)容還是和原來(lái)一樣,并沒(méi)有被修改。這個(gè)時(shí)候我們就要用到 --in-place,加上這個(gè)選項(xiàng)將不會(huì)有任何輸出, autopep8 會(huì)直接修改源文件。
autopep8 --in-place test_search.py