Tools

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ó.

Trang GitHub của astral-sh/ruff
Trang GitHub của astral-sh/ruff (ảnh chụp tháng 11/2026)

GitHub: https://github.com/astral-sh/ruff · khoảng 50 nghìn sao · Rust · MIT

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ốcBắt lỗi gì
FPyflakesBiến/import không dùng, tên chưa định nghĩa
IisortThứ tự import
Bflake8-bugbearTham số mặc định có thể thay đổi, except trống…
UPpyupgradeCú pháp cũ có thể viết gọn hơn ở phiên bản mới
Sflake8-banditVấ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: F401 cuố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-commit với hook ruff-check và 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óm B và 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

  1. astral-sh/ruff — astral-sh (GitHub)
  2. Ruff documentation — astral-sh