Ruff:Python 開發的超級工具,讓你的程式碼又快又規範!
在 Python 的世界裡,保持程式碼的整潔、一致和符合規範是每個開發者的共同目標。過去,我們可能需要安裝一堆工具:Flake8 檢查 Linting 規範、isort 排序 import 語句、Black 自動格式化程式碼,有時還要加上 mypy 進行型別檢查。這不僅安裝配置繁瑣,執行起來也常常拖慢速度。
直到 Ruff 的出現!作為一個用 Rust 編寫的 Python Linter 和 Formatter,Ruff 以其驚人的速度和整合多功能的能力,迅速成為 Python 社群的新寵兒。它不只快,還希望能成為你 Python 開發生態系統中不可或缺的「一站式」工具。
那麼,這個號稱 Python 開發超級工具的 Ruff 究竟有什麼能耐?讓我們一起深入了解它的各個面向,並探討如何將它融入你的開發流程中。
什麼是 Ruff?
Ruff 是一個極速的 Python Linter 和 Formatter,由 Astral (Rye 和 uv 的開發者) 開發,並用 Rust 語言編寫。它旨在提供一個比現有 Python Linting 和格式化工具更快、更整合的解決方案。
它的核心優勢包括:
- 極致的速度:用 Rust 編寫,使得 Ruff 的執行速度比傳統的 Python 工具快 10 到 100 倍。這意味著在大型專案中,你可以頻繁執行檢查而不會感到延遲。
 - 功能整合:Ruff 不僅僅是一個 Linter。它整合了多個流行工具的功能,例如:
- Linting:取代 
Flake8、Pylint等。 - Import 排序:取代 
isort。 - 程式碼格式化:取代 
Black。 - 自動修復:許多檢測到的問題可以直接透過 Ruff 自動修復。
 
 - Linting:取代 
 - 配置簡潔:Ruff 的配置通常比多個工具的配置更容易管理,可以在 
pyproject.toml中統一設定。 
簡而言之,Ruff 的目標是成為 Python 專案程式碼品質管理的「瑞士刀」,且速度飛快。
Ruff Linter:快狠準的程式碼審查
Ruff 作為一個 Linter,其主要任務是分析你的 Python 程式碼,找出潛在的錯誤、風格問題、不良實踐以及可能導致 Bug 的地方。
它不僅實現了 Flake8 的所有常見規則 (如 E 和 W 系列的 PEP 8 規範),還整合了許多其他流行 Linting 工具的規則集,例如:
- Pyflakes (
F):檢測邏輯錯誤,如未使用的變數、未定義的名稱。 - pycodestyle (
E,W):檢查 PEP 8 風格指南,如縮排、空格、行長度。 - isort (
I):檢查 import 語句的排序。 - pylint (部分 
PL):提供更深層的程式碼品質和錯誤檢測。 - Bugbear (
B):尋找潛在的 Bug。 - Comprehensions (
C4):建議更簡潔的推導式寫法。 - Numpy-specific checks (
NPY):針對 NumPy 程式碼的 Linting。 - …還有更多!
 
如何使用 Ruff Linter?
最基本的用法:
1  | ruff check .  | 
這會檢查當前目錄及其所有子目錄下的 Python 檔案。
自動修復:
Ruff 最棒的功能之一是它的自動修復能力。許多 Linting 問題都可以被 ruff 自動修正:
1  | ruff check --fix .  | 
這會修正所有可以自動修復的問題,如移除未使用的 import、調整行尾空格等。
配置規則:
你可以在 pyproject.toml 或 .ruff.toml 中配置 Ruff 的規則。例如,啟用或禁用特定的規則、設定忽略的路徑、調整行長度限制等:
1  | # pyproject.toml  | 
透過簡單的配置,Ruff 就能為你的專案提供高效且全面的 Linting 服務。
Ruff Format:Black 的速度挑戰者
Ruff 在 2023 年底推出了內建的程式碼格式化功能,旨在取代 Black 並提供更快的格式化體驗。它的目標是與 Black 的輸出高度兼容,同時保持其閃電般的速度。
為什麼選擇 Ruff Formatter?
- 速度:這是最主要的優勢。Ruff Formatter 比 Black 更快,這對於大型程式碼庫或需要頻繁格式化的場景(如 pre-commit hook)來說是巨大的提升。
 - 一站式工具:將 Linting 和格式化整合到一個工具中,減少了依賴和配置的複雜性。
 - 兼容性:Ruff Formatter 努力與 
Black保持 99% 的輸出兼容,這意味著你可以相對無痛地從Black遷移過來。 
如何使用 Ruff Formatter?
格式化程式碼:
1  | ruff format .  | 
這會格式化當前目錄及其所有子目錄下的 Python 檔案。
檢查檔案是否已格式化(不會修改檔案):
1  | ruff format --check .  | 
與 Linter 結合使用(先修復 Linting 問題,再格式化):
1  | ruff check --fix . && ruff format .  | 
在 pyproject.toml 中,Ruff 的格式化器會自動繼承 Linter 的 line-length 設定。
Ruff 與 Pre-commit Hook
將 Ruff 與 Git 的 pre-commit hook 結合使用是保持程式碼品質的最佳實踐。這意味著在每次提交 (commit) 程式碼之前,Ruff 會自動檢查並格式化你的程式碼,確保只有符合規範的程式碼才能被提交。
設定步驟:
安裝
pre-commit:如果你還沒安裝,先安裝
pre-commit工具:1
pip install pre-commit
在專案中初始化
pre-commit:在你的專案根目錄執行:
1
pre-commit install
這會在 .git/hooks/ 目錄下創建一個 pre-commit 腳本。
創建
.pre-commit-config.yaml檔案:在你的專案根目錄下,創建一個名為
.pre-commit-config.yaml的文件,並添加以下內容:1
2
3
4
5
6
7
8# .pre-commit-config.yaml
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.5 # 替換為當前最新的 Ruff 版本
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix] # 執行 Linting 並自動修復
- id: ruff-format # 執行格式化id: ruff:執行 Linting 檢查。--fix讓 Ruff 自動修復問題。--exit-non-zero-on-fix確保如果有檔案被修復,pre-commit會失敗,促使你重新add被修改的檔案並再次提交。id: ruff-format:執行格式化。如果檔案未經格式化,pre-commit會失敗,並且ruff format會自動格式化檔案,你只需重新add並提交。
現在,每次你執行
git commit時,Ruff 都會自動運行 Linting 檢查和格式化,確保你的程式碼在進入版本控制之前就是乾淨且規範的。
Ruff 的最佳實踐
要最大化 Ruff 的效益,可以考慮以下最佳實踐:
- 整合到 
pyproject.toml:將所有 Ruff 配置(包括 Linting 規則和 Formatter 相關設定)集中在pyproject.toml中的[tool.ruff]部分。這有助於專案配置的統一和可發現性。 - 與 
Black遷移策略:如果你之前使用Black,可以直接將ruff format納入pre-commit。由於 Ruff 和 Black 的輸出高度兼容,遷移通常非常順利。在過渡期,確保你的 CI/CD 流程也已切換到 Ruff,以避免不一致。 - 逐步啟用規則:Ruff 支援大量的 Linting 規則。剛開始時,你可以從較少的、常用的規則集開始(例如 
E,W,F,I),然後根據團隊的需要逐步啟用更多規則。不要一次啟用所有規則,這可能會產生大量警告,讓團隊難以消化。 - 教育團隊成員:確保所有團隊成員都了解並使用 Ruff。統一的工具和規範能極大提升團隊的開發效率和程式碼品質。
 - 結合 CI/CD:除了 
pre-commithook,務必將ruff check --diff(在 CI 中使用,檢查差異而不直接修改檔案) 和ruff format --check(在 CI 中使用,檢查格式化狀態) 整合到你的 CI/CD 管線中。這能確保即使有人繞過了 pre-commit,不符合規範的程式碼也不會被部署。 - 善用 
--fix和--fix-only:對於日常開發,ruff check --fix非常有用。而ruff check --fix-only則只執行自動修復,不報告無法修復的問題,這在 CI/CD 中進行強制格式化時很有用。 
結論
Ruff 的出現,無疑為 Python 開發者帶來了前所未有的效率提升。它將多個獨立的 Linting 和格式化工具的功能集於一身,並以驚人的速度執行。無論是提升個人開發效率,還是確保團隊程式碼品質的一致性,Ruff 都展現出了巨大的潛力。
透過將 Ruff 融入你的日常開發流程和 CI/CD 管線中,你將能夠以更少的時間,維護更高品質的 Python 程式碼。Python 的工具鏈,正因為像 Ruff 這樣的創新而變得越來越好。你準備好讓 Ruff 成為你的新夥伴了嗎?