幾天前,Python 開(kāi)源社區(qū)又出了一個(gè)不小的新聞:HTTPX 和 Starlette 在同一天將在用的代碼分析工具(flake8、autoflake 和 isort)統(tǒng)一替換成了 Ruff。
HTTPX 是一個(gè)支持異步的 HTTP 客戶(hù)端,Starlette 是一個(gè)輕量級(jí)的 ASGI 框架,它們都是 Python 社區(qū)里的明星項(xiàng)目,目前加起來(lái)有近 20K star。它們都選擇了使用 Ruff,再次擴(kuò)大了 Ruff 的應(yīng)用版圖。
Ruff 是個(gè)誕生僅僅 8 個(gè)月的新興項(xiàng)目,但已呈現(xiàn)出一種席卷 Python 社區(qū)的趨勢(shì)!很多知名的開(kāi)源項(xiàng)目已采納 Ruff,比如 Transformers、Pandas、FastAPI、Airflow、SciPy、Bokeh、Jupyter、LangChain、PaddlePaddle、Sphinx、Pydantic、LlamaIndex……
Ruff 是什么?為什么它能吸引大量的開(kāi)源項(xiàng)目使用?相比于其它代碼分析工具,它有哪些突出之處,是否還有一些局限性?現(xiàn)在是否值得將項(xiàng)目在用的工具都替換成它呢?
帶著這些問(wèn)題,本文將帶你全方位了解這個(gè)火爆的項(xiàng)目。
Ruff 加速 Rust 與 Python 的融合
Ruff 誕生于 2022 年 8 月,它是一個(gè)用 Rust 語(yǔ)言編寫(xiě)的高性能的 Python 靜態(tài)代碼分析工具,比其它分析工具快幾個(gè)數(shù)量級(jí)(10-100 倍),而且功能也很全面。
代碼分析工具
即 Linter,用于檢查代碼中的語(yǔ)法錯(cuò)誤、編碼規(guī)范問(wèn)題、潛在的邏輯問(wèn)題和代碼質(zhì)量問(wèn)題等,可以提供實(shí)時(shí)反饋和自動(dòng)修復(fù)建議。
在 Ruff 出現(xiàn)之前,社區(qū)里的代碼分析工具呈現(xiàn)出百花齊放之勢(shì),比如有 Pylint、Flake8、Autoflake、Pyflakes、Pycodestyle 等等,它們的共同點(diǎn)是都使用 Python 編寫(xiě)而成。
Ruff 異軍突起,在性能方面立于不敗之地,主要得益于 Rust 天然的速度優(yōu)勢(shì)。Ruff 的出現(xiàn),就像基于大語(yǔ)言模型的 ChatGPT 橫空出世,所有競(jìng)爭(zhēng)對(duì)手瞬間就黯淡失色了。
兩個(gè)月前,我翻譯了一篇《Python 2023 年的 3 個(gè)趨勢(shì)》,它預(yù)測(cè)的第一個(gè)趨勢(shì)就是 Rust 將加快融入到 Python 相關(guān)的項(xiàng)目和工具中,舉出的例子就有 Ruff。
我現(xiàn)在可以補(bǔ)充一個(gè)觀察了:用 Rust 開(kāi)發(fā)的新工具將淘汰用其它語(yǔ)言開(kāi)發(fā)的工具,而且新工具的普及速度可能比你的預(yù)想快得多!
Ruff 項(xiàng)目的成功,將刺激出更多 Python+Rust 的項(xiàng)目。它的作者 Charlie Marsh 立志于給 Python 構(gòu)建高性能的開(kāi)發(fā)工具,巧合的是我曾翻譯過(guò)他寫(xiě)的《Using Mypy in production at Spring》,這篇文章恰好發(fā)布于 Ruff 誕生的 2022 年 8 月!
因此,我有理由推測(cè):在 Ruff 項(xiàng)目成熟后,他將用 Rust 開(kāi)發(fā)高性能的 Python 類(lèi)型檢查工具,到時(shí)候,目前流行的 Mypy、Pytype、Pyright 和 Pyre 等工具將迎來(lái)一大勁敵。(題外話:Python 社區(qū)紛亂繁多的虛擬環(huán)境管理工具和依賴(lài)包管理工具,也有望迎來(lái)變革了吧!)
這里還必須介紹兩個(gè) Rust 項(xiàng)目,因?yàn)?Ruff 的成功離不開(kāi)它們:
- RustPython :用 Rust 寫(xiě)成的 Python 解釋器。Ruff 利用了它高性能的 AST 解析器,以此實(shí)現(xiàn)了自己的 AST 遍歷、訪問(wèn)器抽象和代碼質(zhì)量檢測(cè)邏輯
- Maturin :用 Rust 寫(xiě)成的打包工具,可以將 Rust 項(xiàng)目打包成 Python 可用的包,從而可以被我們“pip install”后使用,且不需要配置 Rust 環(huán)境
Ruff 的優(yōu)點(diǎn)與局限性
介紹完最關(guān)鍵的特性后(速度極快、支持 pip),我們接下來(lái)看看 Ruff 的其它方面。
總體而言,它具有這些特點(diǎn):
- 支持
pyproject.toml
- 兼容?Python 3.11
- 超過(guò) 500 條內(nèi)置規(guī)則,與 Flake8 內(nèi)置的規(guī)則集近乎對(duì)等
- 重新實(shí)現(xiàn)了數(shù)十個(gè) Flake8 插件,如 flake8-bugbear、flake8-comprehensions 等
- 支持自動(dòng)修復(fù),可自動(dòng)糾正錯(cuò)誤(例如,刪除未使用的導(dǎo)入)
- 內(nèi)置緩存,可避免重復(fù)分析未更改的文件
- 支持 VS Code、Pycharm、Neovim、Sublime Text、Emacs 等編輯器
- 對(duì) monorepo 友好,具有分層和級(jí)聯(lián)配置
首先最值得介紹的是它支持的規(guī)則。Ruff 借鑒了流行的工具如 Flake8、autoflake、isort、pyupgrade、yesqa 等等,然后用 Rust 重新實(shí)現(xiàn)了超過(guò) 500 條規(guī)則。它本身不支持插件,但是吸收了數(shù)十個(gè)常用的 Flake8 插件的設(shè)計(jì),使得已囊括的規(guī)則范圍比其它任何工具都大。
Ruff 的作者還非常熟悉其它語(yǔ)言的分析工具,比如 Rust 的 Clippy?和?JavaScript 的 ESLint,并從這些項(xiàng)目上得到了設(shè)計(jì)上的啟發(fā)。
Ruff 站在了多個(gè)工具/插件的肩膀上,重新實(shí)現(xiàn)了它們驗(yàn)證過(guò)的規(guī)則,也借鑒了它們的 API 和實(shí)現(xiàn)細(xì)節(jié),這使得它扮演了一種“集大成”的角色,很方便使用者們作工具的順滑遷移。
Ruff 第二個(gè)值得介紹的特點(diǎn)是,它沒(méi)有局限于 Linter 的定位,而是借鑒 Rome、Prettier 和 Black 這些代碼格式化工具(Formatter),也實(shí)現(xiàn)了代碼格式化的功能。借鑒了 Autoflake、ESLint、Fixit 等工具,實(shí)現(xiàn)了代碼自動(dòng)糾錯(cuò)的功能。另外,它還借鑒了使用很廣泛的 isort,支持對(duì) import 作快速排序。
這些表明作者的目標(biāo)并不只是開(kāi)發(fā)一款優(yōu)秀的代碼分析工具,而是在靜態(tài)代碼分析的核心功能外,要?jiǎng)?chuàng)造出更多的可能性。此舉是開(kāi)發(fā)者的福音啊,以后一個(gè)工具就能滿足多種訴求,再也不必糾結(jié)于不同工具的選型、協(xié)作與維護(hù)了!
Ruff 還有其它的優(yōu)點(diǎn),例如支持 pyproject.toml
?、支持 Python 3.11、支持只分析變更的文件,等等。另外,它也有著一些局限性:
- 支持的 lint 規(guī)則還有不夠
- 不支持使用插件,擴(kuò)展性不強(qiáng)
- 用 Rust 開(kāi)發(fā)的,因此不便于在出錯(cuò)時(shí) debug,也不便于 Python 開(kāi)發(fā)者給它貢獻(xiàn)代碼
關(guān)于第一點(diǎn),畢竟 Ruff 只是 8 個(gè)月大的新生項(xiàng)目,支持更多的規(guī)則,只是時(shí)間問(wèn)題。至于插件帶來(lái)的擴(kuò)展性和編程語(yǔ)言的開(kāi)發(fā)者生態(tài),原因也是 Rust,屬于“有得必有失”了。
Ruff 的使用
介紹完 Ruff 的整體情況后,我們接著看看該如何使用它吧。
首先是安裝,可以用 Conda 和其它包管理工具,也可以直接用 pip:
pip install ruff
可以通過(guò)以下命令運(yùn)行:
ruff check . # 分析當(dāng)前及子目錄內(nèi)的所有文件
ruff check path/to/code/ # 分析指定目錄及子目錄內(nèi)的所有文件
ruff check path/to/code/*.py # 分析指定目錄內(nèi)的所有py文件
ruff check path/to/code/to/file.py # 分析 file.py
可以用作預(yù)提交的鉤子:
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
rev: 'v0.0.261'
hooks:
- id: ruff
可以通過(guò)?pyproject.toml
?,ruff.toml
?或?.ruff.toml
?文件進(jìn)行配置,默認(rèn)配置已能滿足基本使用,詳細(xì)配置可以參見(jiàn)文檔的?Configuration 。
Ruff 提供了官方的 VS Code 插件,可以快速上手:
Ruff 官方?jīng)]有提供 Pycharm 的插件,社區(qū)中有人發(fā)布了一個(gè) Ruff 插件。
另外,它還提供了ruff-lsp
,可以被集成到任何支持 Language Server Protocol 的編輯器中,例如?Neovim、Sublime Text、Emacs 等等。
小結(jié)
本文從 HTTPX 和 Starlette 采納 Ruff 的新聞開(kāi)始,向讀者介紹了這個(gè)僅誕生 8 個(gè)月卻俘獲了一大批知名開(kāi)源項(xiàng)目。它最突出的特點(diǎn)是使用 Rust 開(kāi)發(fā),因此在性能方面遠(yuǎn)遠(yuǎn)超越同類(lèi)工具,此外,它借鑒了眾多工具和插件的設(shè)計(jì),不僅靜態(tài)代碼分析的規(guī)則全面,而且還具備代碼格式化、代碼自動(dòng)糾錯(cuò)和 import 排序等非其它 linter 所擁有的功能。
Ruff 的成功為 Python 社區(qū)提供了一個(gè)鮮活的榜樣,可以預(yù)見(jiàn),我們將迎來(lái)一波用 Rust 開(kāi)發(fā)的高性能工具。Ruff 的成功,與最近火爆的 ChatGPT 一樣,它們傳遞出了一個(gè)“這事兒能成”的信號(hào),從而會(huì)引爆一場(chǎng)使用新技術(shù)的變革?。ǚ浅G珊系氖牵篟ust 1.0 在 2015 年 5 月發(fā)布,而 OpenAI 在 2015 年 12 月成立。)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-408805.html
總體而言,Ruff 非常強(qiáng)大,憑實(shí)力而風(fēng)靡 Python 社區(qū),絕對(duì)推薦使用!它的使用文檔很友好,如果你想了解更多細(xì)節(jié),可以去翻查。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-408805.html
到了這里,關(guān)于性能最快的代碼分析工具,Ruff 正在席卷 Python 圈!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!