Ruff vs Pylint: velocidade vs profundidade no linting Python
O Ruff é um linter Rust extremamente rápido que substitui muitas ferramentas; o Pylint é mais lento, mas realiza uma análise mais profunda e mais opinativa.
O Ruff faz lint (e pode formatar) Python em uma fração do tempo das ferramentas legadas, reimplementando muitas regras do Flake8/pycodestyle/pyflakes em Rust. O Pylint executa verificações semânticas mais profundas e heurísticas de design que o Ruff não cobre por completo.
| Ruff | Pylint | |
|---|---|---|
| Linguagem | Rust | Python |
| Velocidade | Muito rápido (ordens de magnitude) | Lento em código grande |
| Amplitude de regras | Muitos Flake8/plugins reimplementados | Verificações semânticas + de design profundas |
| Configuração | pyproject.toml [tool.ruff] | .pylintrc / pyproject |
| Autofix | Sim para muitas regras | Sem autofix |
Onde o Ruff ganha
O Ruff é rápido o suficiente para rodar a cada save e a cada commit sem atrito, e consolida Flake8, isort, pyupgrade e mais atrás de uma única ferramenta e configuração. Ele autocorrige muitos problemas. Para a maioria dos times, ele cobre as regras de lint que eles realmente aplicam.
Onde o Pylint ganha
O Pylint realiza uma análise mais profunda: pega certos problemas de lógica, sinaliza cheiros de design (argumentos demais, complexidade) e aplica verificações opinativas que o Ruff não implementa por completo. Se você depende dos avisos de design ou refatoração do Pylint, o Ruff ainda não é um substituto completo.
Em CI
Muitos times rodam o Ruff como o portão rápido em cada PR e rodam o Pylint com menos frequência (à noite ou sob demanda) por seu sinal mais profundo. O Ruff reduz drasticamente o tempo de lint nos pipelines; o Pylint adiciona profundidade onde você quiser.
O veredito
Use o Ruff como seu linter e formatador rápido primário para o CI do dia a dia; adicione o Pylint quando quiser suas verificações semânticas e de design mais profundas. Eles são mais complementares do que mutuamente exclusivos.