七套Python庫快速提升您項(xiàng)目的代碼可維護(hù)性
譯文【51CTO.com快譯】檢查Python代碼的健康狀況,并利用以下外部庫提升其可維護(hù)水平。
當(dāng)軟件項(xiàng)目進(jìn)入“維護(hù)模式”時(shí),原本的代碼可讀性與編碼標(biāo)準(zhǔn)往往很難得到保證。(當(dāng)然,這些標(biāo)準(zhǔn)在軟件項(xiàng)目建立之初就不容易堅(jiān)持實(shí)施。)但必須強(qiáng)調(diào)的是,在代碼庫中保持樣式與測(cè)試標(biāo)準(zhǔn)的一致性,正是降低維護(hù)負(fù)擔(dān)的重要前提。只有這樣,我們才能確保未來的開發(fā)人員得以快速了解新的情況,并隨著時(shí)間推移切實(shí)保證項(xiàng)目與應(yīng)用程序的健康狀況。
保護(hù)項(xiàng)目未來可維護(hù)性的一種理想方式,在于利用外部庫檢查您的代碼運(yùn)行狀況。以下是目前開發(fā)人員最喜愛的的代碼梳理庫,它們能夠以強(qiáng)制方式執(zhí)行一致性樣式,并確保項(xiàng)目在成熟之后仍具備可接受的測(cè)試覆蓋率。
檢查您的代碼樣式
PEP 8是一套Python代碼樣式指南,其為行長度、縮進(jìn)、多行表達(dá)式以及命名約定等內(nèi)容提供重要的執(zhí)行規(guī)則。當(dāng)然,您的團(tuán)隊(duì)也許擁有自己的樣式規(guī)則,且其與PEP 8略有不同。
憑借代碼樣式指南都擁有同樣的目標(biāo)——在代碼庫中強(qiáng)制實(shí)施一致的標(biāo)準(zhǔn),從而使其更具可讀性并降低維護(hù)難度。在這方面,以下三套庫能夠幫助大家高效改善代碼質(zhì)量。
1. Pylint
Pylint 是一套用于檢查PEP 8樣式違規(guī)與常見錯(cuò)誤的庫。它能夠與多種高人氣編輯器及IDE良好集成,亦可通過命令行加以運(yùn)行。
您可以運(yùn)行pip install pylint命令以進(jìn)行安裝。
要通過命令行使用Pylint,您需要運(yùn)行 pylint [options] path/to/dir or pylint [options] path/to/module.py。Pylint將向控制臺(tái)輸出關(guān)于樣式違規(guī)以及其他錯(cuò)誤警告。
大家也可以利用 pylintrc配置文件自定義Pylint的錯(cuò)誤檢查。
2. Flake8
Flake8是一款“Python工具,可將PEP 8、Pyflakes(類似于Pylint)、McCabe(代碼復(fù)雜性檢查器)以及其他第三方插件加以結(jié)合,用以檢查Python代碼中的樣式與質(zhì)量。”
要使用Flake8,您需要運(yùn)行 pip install flake8。而后,運(yùn)行flake8 [options] path/to/dir or flake8 [options] path/to/module.py 查看相關(guān)錯(cuò)誤與警告信息。
與Pylint類似,F(xiàn)lake8也允許用戶對(duì)配置文件的檢查內(nèi)容進(jìn)行自定義,其中包含非常清晰的文檔,例如一些實(shí)用的commit hook,用以自動(dòng)檢查開發(fā)流程中的代碼片段。
Flake8能夠集成各類流行編輯器與IDE,但文檔當(dāng)中通常并未提及相關(guān)指令。要將Flake8與您喜愛的編輯器或IDE進(jìn)行集成,請(qǐng)?jiān)诰€搜索相關(guān)插件(例如 Flake8 plugin for Sublime Text)。
3. Isort
Isort是一套庫,能夠按字母順序?qū)δ膶?dǎo)入內(nèi)容進(jìn)行排序并將其拆分為適當(dāng)部分(例如標(biāo)準(zhǔn)庫導(dǎo)入、第三方庫導(dǎo)入、來自您自有項(xiàng)目的導(dǎo)入等)。這將提升代碼可讀性并在模塊中包含大量導(dǎo)入內(nèi)容時(shí)降低查找難度。
要安裝isort,您需要運(yùn)行 pip install isort,而后使用 isort path/to/module.py命令加以運(yùn)行。關(guān)于更多配置選項(xiàng),請(qǐng)參閱 說明文檔。例如,您可以通過isort.cfg文件配置isort如何處理來自某套庫的多行導(dǎo)入代碼。
與Falke8及Pylint一樣,isort同時(shí)提供多款插件以集成各類流行編輯器及IDE。
代碼樣式外包
需要強(qiáng)調(diào)的是,在命令行中手動(dòng)為需要變更的各個(gè)文件進(jìn)行代碼梳理是一項(xiàng)痛苦的工作,大家也可能并不喜歡特定插件在IDE中的運(yùn)行方式。
此外,您的同事可能更傾向于利用不同的插件或者干脆不配合任何插件使用自己喜愛的編輯器; 或者您自己可能不想投入太多心力進(jìn)行代碼梳理并根據(jù)警告內(nèi)容做出調(diào)整。隨著時(shí)間的推移,這一切都可能令您的共享代碼庫變得混亂且難以閱讀。
在這方面,一大理想解決方案是利用庫自動(dòng)對(duì)代碼進(jìn)行重新格式化,從而直接為您傳遞PEP 8內(nèi)容。這里我們推薦的三套庫都擁有不同級(jí)別的自定義能力,亦會(huì)以不同的默認(rèn)方式進(jìn)行代碼格式化。
這些默認(rèn)方式各有優(yōu)劣,因此大家可能需要像使用Pylint以及Flake8那樣對(duì)其進(jìn)行測(cè)試,看看哪些能夠提供最有效的自定義選項(xiàng),又有哪些不可更改的默認(rèn)值比較符合您的要求。
4. Autopep8
Autopep8 能夠自動(dòng)對(duì)您指定的模塊內(nèi)的代碼進(jìn)行格式化。它會(huì)進(jìn)行重新縮進(jìn)、修復(fù)縮進(jìn)、刪除不必要的空格,同時(shí)重構(gòu)常見的比較錯(cuò)誤(例如布爾值與None)。感興趣的朋友可以點(diǎn)擊此處查看其文檔中的完整更正列表。
要安裝Autopep8,您需要運(yùn)行pip install --upgrade autopep8。要對(duì)代碼進(jìn)行重新格式化,需要運(yùn)行autopep8 --in-place --aggressive --aggressive <filename>。其中的aggressive標(biāo)記(及其數(shù)量)表示您希望在代碼樣式上為autopep8提供多少控制權(quán)空間。您可以點(diǎn)擊此處了解關(guān)于aggressive選項(xiàng)的更多細(xì)節(jié)信息。
5. Yapf
Yapf 是另一種代碼重新格式化選項(xiàng),其提供自己的配置選項(xiàng)列表。與autopep8不同,yapf不僅能夠解決PEP 8違規(guī)問題,同時(shí)亦會(huì)重新格式化那些并不違反特定PEP 8規(guī)則的代碼——包括不符合樣式一致性或者存在其他可讀性問題的部分,從而進(jìn)一步提升代碼可維護(hù)性。
要安裝yapf,您需要運(yùn)行 pip install yapf。要對(duì)代碼進(jìn)行重新格式化,需要運(yùn)行 yapf [options] path/to/dir 或者yapf [options] path/to/module.py。您可以點(diǎn)擊此處查看自定義選項(xiàng)的完整列表。
6. Black
Black在代碼重新格式化領(lǐng)域可謂后起之秀。它與autopep8以及Yapf頗為相似,但又有著自己的特點(diǎn)。重點(diǎn)在于,Black提供的自定義選項(xiàng)非常有限。換言之,其基本思路是用戶不應(yīng)對(duì)代碼樣式做出決定,而應(yīng)將決定權(quán)交給Black。當(dāng)然,大家也可以查看有限的自定義選項(xiàng),并將其存儲(chǔ)在配置文件當(dāng)中。
Black要求配合Python 3.6+使用,但亦可對(duì)Python 2代碼進(jìn)行格式化。要使用Black,您需要運(yùn)行 pip install black。要對(duì)代碼進(jìn)行格式化,您需要運(yùn)行: black path/to/dir 或者 black path/to/module.py。
檢查測(cè)試覆蓋率
在編寫測(cè)試的過程中,大家需要確保其能夠?qū)Υa庫中的新代碼進(jìn)行測(cè)試,同時(shí)不致降低您的測(cè)試覆蓋率。盡管測(cè)試覆蓋率百分比并非衡量測(cè)試有效性與充分性的惟一指標(biāo),但其無疑是確保項(xiàng)目遵循基本測(cè)試標(biāo)準(zhǔn)的重要方法之一。為了衡量測(cè)試覆蓋率,我們向您推薦Coverage。
7. Coverage
Coverage擁有多個(gè)選項(xiàng),可用于向您報(bào)告測(cè)試覆蓋率,具體包括將結(jié)果輸出至控制臺(tái)或HTML頁面,并指示哪些行號(hào)存在測(cè)試覆蓋缺失。您可以設(shè)置配置文件以自定義Coverage的檢查內(nèi)容,并降低其運(yùn)行難度。
要安裝Coverage,您需要運(yùn)行pip install coverage。要運(yùn)行程序并查看其輸出結(jié)果,需要運(yùn)行 coverage run [path/to/module.py] [args],而后查看程序的輸出結(jié)果即可。要獲取哪些代碼行未被測(cè)試覆蓋,需要運(yùn)行 coverage report -m。
持續(xù)集成工具
持續(xù)集成(簡(jiǎn)稱CI)是您可以運(yùn)行的一系列流程,用于在代碼合并與部署之前自動(dòng)檢查梳理錯(cuò)誤并給出測(cè)試覆蓋率的最小值。目前有多種免費(fèi)或付費(fèi)工具能夠自動(dòng)完成上述目標(biāo),這里我們就不一一贅述了。不過考慮到持續(xù)集成是實(shí)現(xiàn)代碼可讀性與可維護(hù)性的重要環(huán)節(jié),這里向大家推薦兩種一般性持續(xù)集成工具:Travis CI 與 Jenkins。
原文標(biāo)題:7 Python libraries for more maintainable code,作者:Jeff Triplett
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】