Ruff: linter và formatter Python thay Flake8, isort, Black trong một công cụ
Tóm tắt
Ruff gộp linter và formatter Python, hơn 900 quy tắc từ Flake8, isort, pyupgrade, bugbear. ruff check --fix và ruff format, cấu hình trong [tool.ruff], bật thêm nhóm I, B, UP; xem lại diff khi dùng unsafe fixes.
Một project Python điển hình dùng Flake8 để lint, cùng vài plugin, isort để sắp xếp import, Black để format, pyupgrade để nâng cú pháp. Bốn công cụ, bốn file cấu hình, và chạy trên codebase lớn có thể mất cả phút. Ruff của Astral, viết bằng Rust, làm cả linter lẫn formatter trong một công cụ, hỗ trợ hơn 900 quy tắc lấy từ các công cụ quen thuộc, và theo README nhanh hơn 10 đến 100 lần so với các linter hiện có.

Cài đặt
uv tool install ruff # hoặc: pipx install ruff / pip install ruff
uvx ruff check # chạy thử không cần cài
curl -LsSf https://astral.sh/ruff/install.sh | sh
Hai lệnh chính
ruff check . # lint toàn bộ project
ruff check --fix . # tự sửa các lỗi sửa được an toàn
ruff format . # format code (tương thích phong cách Black)
ruff format --check . # chỉ kiểm tra, dùng trong CI
ruff rule F401 # giải thích một quy tắc
Cấu hình trong pyproject.toml
[tool.ruff]
line-length = 100
target-version = "py312"
[tool.ruff.lint]
select = [
"E", "F", # pycodestyle, Pyflakes (mặc định)
"I", # isort: sắp xếp import
"B", # flake8-bugbear: lỗi tiềm ẩn
"UP", # pyupgrade: cú pháp Python mới
"SIM", # flake8-simplify
]
ignore = ["E501"]
[tool.ruff.lint.per-file-ignores]
"tests/**" = ["B011"]
[tool.ruff.format]
quote-style = "double"
Cũng có thể dùng file ruff.toml riêng. Mặc định Ruff chỉ bật nhóm E và F cơ bản; bạn chủ động chọn thêm nhóm quy tắc theo nhu cầu.
Nhóm quy tắc nên biết
| Mã | Nguồn gốc | Bắt lỗi gì |
|---|---|---|
F | Pyflakes | Biến/import không dùng, tên chưa định nghĩa |
I | isort | Thứ tự import |
B | flake8-bugbear | Tham số mặc định có thể thay đổi, except trống… |
UP | pyupgrade | Cú pháp cũ có thể viết gọn hơn ở phiên bản mới |
S | flake8-bandit | Vấn đề bảo mật như eval, mật khẩu cứng |
Tắt cảnh báo và sửa không an toàn
- Bỏ qua một dòng: thêm
# noqa: F401cuối dòng. - Một số sửa đổi có thể đổi hành vi code nên được đánh dấu "unsafe"; chỉ áp dụng khi bạn chấp nhận, bằng
ruff check --fix --unsafe-fixes, và xem lại diff. - Chuyển dần cho codebase lớn: bật thêm nhóm quy tắc từng bước, dùng
--add-noqađể đánh dấu lỗi hiện có rồi sửa dần.
Tích hợp
- Editor: extension Ruff cho VS Code, và hỗ trợ qua language server cho các editor khác: lint và format khi lưu file.
- pre-commit: repo
astral-sh/ruff-pre-commitvới hookruff-checkvàruff-format. - CI:
ruff check --output-format=github .để lỗi hiện thẳng trên dòng code trong PR.
Áp dụng thế nào?
- Dev: Bật format khi lưu trong editor; không còn tranh luận định dạng trong review.
- Tech Lead: Thay Flake8 + isort + Black bằng Ruff, gom cấu hình vào
pyproject.toml, bật nhómBvàUPđể bắt lỗi thật chứ không chỉ định dạng. - PM: Một công cụ thay bốn, CI nhanh hơn, ít cấu hình phải bảo trì.
Nguồn & tham khảo
- astral-sh/ruff — astral-sh (GitHub)
- Ruff documentation — astral-sh