日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python 工具链让你写的代码更规范

發(fā)布時(shí)間:2025/3/19 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 工具链让你写的代码更规范 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

從以前一個(gè)不會(huì)敲 Python 代碼的小白,到現(xiàn)在敲 Python 代碼賊溜的老鳥(niǎo)的過(guò)程中,除了通過(guò)大量的學(xué)習(xí)、實(shí)踐讓自己現(xiàn)在更容易寫(xiě)出 Pythonic 的代碼外,大部分時(shí)間里還是多虧著有著許多好用的工具輔助我,去檢查我代碼中的問(wèn)題,幫助我寫(xiě)出更規(guī)范的代碼。

學(xué)習(xí)和實(shí)踐新知識(shí)可能對(duì)于大多數(shù)人來(lái)說(shuō)都沒(méi)有統(tǒng)一的定式,但使用工具至少可以讓我們大家風(fēng)格統(tǒng)一也更容易和他人協(xié)作共事。因此無(wú)論對(duì)于剛?cè)腴T(mén)的小白還是正在成長(zhǎng)的新人來(lái)說(shuō),會(huì)使用能輔助你寫(xiě)出更規(guī)范的代碼的工具也是十分有必要的。

black

隨著?PEP8?規(guī)范的提出,Python 社區(qū)也有了自己的一套關(guān)于 Python 代碼的規(guī)范指導(dǎo)。但我相信,大多數(shù)人其實(shí)并不會(huì)條分縷析地去瀏覽或記下規(guī)范里的大多數(shù)內(nèi)容,因?yàn)檫@些內(nèi)容往往都過(guò)于瑣碎,以至于在實(shí)際開(kāi)發(fā)中我們很難做到去一邊寫(xiě)代碼一邊去檢查我們是否合乎 PEP8 規(guī)范。所以最好的方法就是借助格式化工具幫我們完成這一機(jī)械的操作。

早期 Python 著名的格式化工具的有?autopep8?和 Google 的yapf,但在實(shí)際過(guò)程中或多或少需要一些配置。

如果你使用過(guò) Go 語(yǔ)言,那可能會(huì)對(duì) Go 自帶的 gofmt 贊嘆不已。因?yàn)樗炔粫?huì)要求你進(jìn)行多余的配置,還能在每次保存代碼時(shí)強(qiáng)制幫你進(jìn)行格式化,所以無(wú)論和你協(xié)作的同事們代碼風(fēng)格和個(gè)人習(xí)慣如何,它都能將其轉(zhuǎn)換成符合工程的、規(guī)范的樣式。

而?black?就是類(lèi)似于 gofmt 這樣號(hào)稱(chēng)?「不妥協(xié)」(uncompromising)的 Python 格式化工具,它讓我們將更多的時(shí)間和精力放在編寫(xiě)代碼上,而無(wú)需過(guò)度關(guān)注于格式化的配置細(xì)節(jié)。因此當(dāng)我們?cè)趫F(tuán)隊(duì)協(xié)作中只要是使用了 black 工具之后,大部分情況下代碼看起來(lái)都是十分統(tǒng)一的。

比如說(shuō)下面這一段代碼(來(lái)源于官方示例):

def?very_important_function(template:?str,?*variables,?file:?os.PathLike,?engine:?str,?header:?bool?=?True,?debug:?bool?=?False):"""Applies?`variables`?to?the?`template`?and?writes?to?`file`."""with?open(file,?'w')?as?f:...

由于?very_important_function?已經(jīng)加上了類(lèi)型注解,因此在現(xiàn)有的部分參數(shù)所占寬度的基礎(chǔ)上又?jǐn)U展了一些,所以如果我們顯示器的寬度不夠時(shí),就需要橫向拖動(dòng)才能查看參數(shù)信息;而最好的辦法就是采取豎向的方式進(jìn)行排列,便于我們能自上而下的一覽無(wú)遺。所以使用 black 之后上述代碼將會(huì)是這樣:

def?very_important_function(template:?str,*variables,file:?os.PathLike,engine:?str,header:?bool?=?True,debug:?bool?=?False, ):"""Applies?`variables`?to?the?`template`?and?writes?to?`file`."""with?open(file,?"w")?as?f:...

可以看出,經(jīng)過(guò)格式化后的函數(shù)其參數(shù)層次分明地對(duì)齊,可讀性大大的增強(qiáng)了;并且如果需要對(duì)函數(shù)中的參數(shù)進(jìn)行注釋或增加,直接新增或減少一行即可,絲毫不會(huì)額外調(diào)整其他參數(shù)的位置。

盡管說(shuō) black 還是一個(gè)實(shí)驗(yàn)項(xiàng)目,但它早已頻繁被使用在一些主流的 Python 開(kāi)源項(xiàng)目中,比如 Pandas、SQLAlchemy、Pytest 等,所以就算在實(shí)際開(kāi)發(fā)中我們一樣可以沒(méi)有顧慮地使用它。

使用 black 的方式很簡(jiǎn)單,通過(guò)?pip install black?安裝到你的 Python 環(huán)境中,然后在代碼中運(yùn)行:

black?<項(xiàng)目文件夾?/?源碼文件夾?/?.py?文件等>

black 命令行也提供了一些參數(shù)項(xiàng)(但不會(huì)太多),我們大部分時(shí)候即使我們使用默認(rèn)的也是足夠了的,具體我們可以參考 black 的官方文檔。

isort

isort?是一個(gè)名為 PyCQA(Python Code Quality Authority)組織所維護(hù)的代碼質(zhì)量工具中的其中一個(gè)開(kāi)源項(xiàng)目,它同樣是用來(lái)對(duì)代碼進(jìn)行格式化。但不同于 black 的是,它主要用來(lái)格式化我們?import?的庫(kù)或模塊。

Python 社區(qū)的生態(tài)一直都是十分豐富,所以在開(kāi)發(fā)項(xiàng)目的過(guò)程中我們往往會(huì)使用到多個(gè)庫(kù)或同一個(gè)庫(kù)中的多個(gè)模塊,但在缺乏規(guī)范的情況下,被導(dǎo)入的部分可能會(huì)凌亂、無(wú)組織地分散在我們的代碼中,所以當(dāng)我們復(fù)現(xiàn)代碼時(shí)很可能就會(huì)因?yàn)橥泴?dǎo)入某些模塊而報(bào)錯(cuò)。

就像官方給出的示例代碼一樣:

from?my_lib?import?Object import?os from?my_lib?import?Object3 from?my_lib?import?Object2 import?sys from?third_party?import?lib15,?lib1,?lib2,?lib3,?lib4,?lib5,?lib6,?lib7,?lib8,?lib9,?lib10,?lib11,?lib12,?lib13,?lib14 import?sys from?__future__?import?absolute_import from?third_party?import?lib3print("Hey") print("yo")

上述的代碼存在了多種 import 風(fēng)格,比如同一模塊下分別導(dǎo)入的部分各占一行、同一模塊下導(dǎo)入的部分只站一行等;并且還存在重復(fù)導(dǎo)入的情況。因此要么我們就干脆每個(gè)導(dǎo)入的部分只占一行,要么就是來(lái)自同一模塊下的導(dǎo)入部分都連接在一起。默認(rèn)情況下 isort 會(huì)是后者:

from?__future__?import?absolute_importimport?os import?sysfrom?third_party?import?(lib1,?lib2,?lib3,?lib4,?lib5,?lib6,?lib7,?lib8,lib9,?lib10,?lib11,?lib12,?lib13,?lib14,?lib15)from?my_lib?import?Object,?Object2,?Object3print("Hey") print("yo")

使用了 isort 之后它會(huì)將我們每個(gè)?.py?文件下中?import部分的代碼進(jìn)行規(guī)整,同時(shí)它會(huì)按照內(nèi)置庫(kù)(及字母順序)、第三方庫(kù)以及本地自有模塊的次序?qū)ξ覀兯鶎?dǎo)入的部分進(jìn)行排列。這樣我們的代碼不僅看起來(lái)清爽了許多,同時(shí)也能準(zhǔn)確定位到我們已經(jīng)導(dǎo)入的部分有哪些。

isort 不會(huì)像 black 那樣「執(zhí)拗」,而是也給你盡可能地預(yù)留了一些可供自定義的配置項(xiàng),以便能滿足不同風(fēng)格或團(tuán)隊(duì)規(guī)范的需要。但對(duì)它的使用和 black 一樣簡(jiǎn)單,只需要將其安裝到我們的環(huán)境中后,直接調(diào)用即可:

isort?<項(xiàng)目文件夾?/?源碼文件夾?/?.py?文件等>

靜態(tài)檢查工具

由于像 Python、JavaScript 這些動(dòng)態(tài)類(lèi)型的解釋型語(yǔ)言,不具備 Java、Go 這樣靜態(tài)類(lèi)型的編譯型語(yǔ)言在編譯期時(shí)的檢查機(jī)制,因此當(dāng)一個(gè)項(xiàng)目中的代碼量過(guò)多時(shí),就會(huì)造成「動(dòng)態(tài)一時(shí)爽,重構(gòu)火葬場(chǎng)」的局面。

盡管 Python 社區(qū)推行了 PEP484 提案并讓 Python 擁有了類(lèi)型注解的能力,但不正確的使用依舊是很難達(dá)到靜態(tài)語(yǔ)言編譯檢查的那種效果。所以,一些靜態(tài)類(lèi)型檢查工具也就應(yīng)運(yùn)而生,以便能及時(shí)發(fā)現(xiàn)我們代碼中的問(wèn)題

目前關(guān)于 Python 的靜態(tài)檢查工具有許多,知名的有那么幾個(gè):

  • pylint:PyQCA 團(tuán)隊(duì)維護(hù),提供了高度的可配置項(xiàng)(這當(dāng)然也是缺點(diǎn)),如果你有在 VS Code 編寫(xiě)過(guò) Python 代碼,那么有可能就會(huì)碰到讓你安裝 pylint 的情況;

  • flake8:仍是由 PyQCA 團(tuán)隊(duì)維護(hù),它在功能上和 pylint 存在重疊的地方,但它也集成了 PEP8、McCabe 以及第三方插件等多個(gè)部分,功能上比 pylint 相對(duì)豐富一些;

  • mypy:由 Python 的締造者 Guido van Rossum(Python 使用者們親切將其稱(chēng)為龜叔)在 Dropbox 工作時(shí)所創(chuàng)建,可以說(shuō)沒(méi)有人比他更了解 Python 了,也可以算作是相對(duì)權(quán)威靜態(tài)檢查工具了;

  • pyright?由微軟開(kāi)源的、基于 TypeScript 和 JavaScript 編寫(xiě),高度集成于 VS Code,對(duì)于經(jīng)常使用 VS Code 來(lái)寫(xiě)代碼的人來(lái)說(shuō)或許是個(gè)比較好的選擇;

  • pytype?由谷歌開(kāi)源并維護(hù),但相對(duì)于其他工具來(lái)說(shuō)檢查會(huì)較為寬松一些。

以上都是使用人數(shù)多的、并且質(zhì)量都較為上乘靜態(tài)檢查工具,可以根據(jù)自己或團(tuán)隊(duì)的實(shí)際需要來(lái)選擇;不過(guò) flake8 和 mypy 通常都算是一個(gè)正規(guī)項(xiàng)目中的標(biāo)配了,這里我就只以 flake8 為例。

和前面兩個(gè)的工具一樣,先通過(guò)?pip install flake8?命令安裝之后再使用:

flake8?<項(xiàng)目文件夾?/?源碼文件夾?/?.py?文件等>

大部分情況下,flake8 會(huì)根據(jù)默認(rèn)的一些規(guī)范對(duì)代碼進(jìn)行檢查,默認(rèn)是依照 pyflake 的錯(cuò)誤(或違規(guī))碼表來(lái)進(jìn)行檢查,你可以在 flake8 官方?《Error/Violation Codes》?一章中瀏覽到完整的碼表;當(dāng)然我們也可以通過(guò)特定的命令行參數(shù)來(lái)指定檢查的事項(xiàng)或忽略掉的事項(xiàng):

flake8?--select?E121?example.py

這里就只會(huì)選擇檢查?E121?這項(xiàng)來(lái)自于 pycodestyle 碼表中的一項(xiàng),如果代碼導(dǎo)入的模塊或包沒(méi)有縮進(jìn)或懸掛,那 flake8 就會(huì)在檢查代碼之后拋出信息:

example.py:5:9:?E121?continuation?line?under-indented?for?hanging?indent

這里就對(duì)應(yīng)著?example.py?文件里的第 5 行到第 9 行代碼,我們直接就可以根據(jù) flake8 的結(jié)果精準(zhǔn)修改檢驗(yàn)不通過(guò)的部分即可。

工具鏈整合

上述說(shuō)的幾個(gè)工具,大部分情況都能通過(guò) IDE、腳本、Git Hook 等途徑得到有效整合。通常情況下我都會(huì)在每次提交代碼到倉(cāng)庫(kù)前預(yù)先分別使用 isort、black 以及靜態(tài)檢查的 flake8。

由于 black 的情況會(huì)比較特殊,像 isort 這樣的格式化工具處理過(guò)后的代碼都會(huì) black 再次格式化,因此 black 也給出了兼容其他工具的配置項(xiàng)共同選項(xiàng),盡最大程度的和其他工具共存。根據(jù) black 官方的建議,通常我們可以放在某些配置文件中,比如?pyproject.toml、setup.cfg?等,內(nèi)容如下:

multi_line_output?=?3 include_trailing_comma?=?True force_grid_wrap?=?0 use_parentheses?=?True ensure_newline_before_comments?=?True line_length?=?88

同理,flake8 也是如此:

max-line-length?=?88 extend-ignore?=?E203,?W503

因此我們可以將以上內(nèi)容都寫(xiě)在一個(gè)配置文件中,這里我選的是?setup.cfg?文件中:

[isort] multi_line_output = 3 include_trailing_comma = True force_grid_wrap = 0 use_parentheses = True ensure_newline_before_comments = True line_length = 88[flake8] max-line-length = 88 extend-ignore = E203, W503

這樣就能使得 black、isort 和 flake8 能夠更好地協(xié)同工作;同時(shí)我們可以將其放在一個(gè)腳本文件中,方便每次運(yùn)行調(diào)用,大致類(lèi)似于:

#?code_fmt.shWORKDIR=$PWD isort?$WORKDIR?\&&?black?$WORKDIR?--skip-string-normalization?\&&?flake8?$WORKDIR

當(dāng)然我們也可以將其集成在我們的 IDE 中,比如在 VS Code 中,當(dāng)我們安裝好上述工具后,可以在設(shè)置項(xiàng)中關(guān)于 Python 的配置項(xiàng)里找到關(guān)于上述工具的配置欄目。

總結(jié)

以上是生活随笔為你收集整理的Python 工具链让你写的代码更规范的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。