Flake8 vs Ruff: A Virada no Linting de Python
O Ruff reimplementa a maioria das verificações do Flake8 em Rust e roda muito mais rápido; o Flake8 mantém uma longa cauda de plugins e familiaridade.
O Flake8 tem sido o linter padrão de Python, unindo pyflakes, pycodestyle e um ecossistema de plugins. O Ruff cobre muitas dessas mesmas regras com velocidade muito maior, com um único binário e uma única config.
| Flake8 | Ruff | |
|---|---|---|
| Linguagem | Python | Rust |
| Velocidade | Lenta em repositórios grandes | Muito rápida |
| Plugins | Ecossistema grande | Muitas regras embutidas, menos plugins externos |
| Config | setup.cfg / .flake8 / tox.ini | pyproject.toml [tool.ruff] |
| Autofix | Não | Sim para muitas regras |
Onde o Ruff vence
O Ruff é muito mais rápido, corrige automaticamente muitos problemas e consolida várias ferramentas por trás de uma única config. Ele mapeia os códigos de regra do Flake8, então a migração muitas vezes é uma questão de habilitar os conjuntos de regras equivalentes. Para a maioria das bases de código, ele cobre as verificações que você de fato usa.
Onde o Flake8 vence
O Flake8 tem um ecossistema de plugins grande e maduro. Se você depende de um plugin de nicho do Flake8 que o Ruff ainda não reimplementou, o Flake8 ainda tem a cauda longa mais ampla. Alguns times também valorizam seu histórico longo e estável.
Migração
Mova a config do Flake8 para [tool.ruff], habilite as famílias de regras correspondentes e compare a saída na sua base de código antes de trocar o gate de CI. Mantenha um plugin específico do Flake8 apenas se o Ruff não tiver um equivalente.
O veredito
Para a maioria dos projetos, o Ruff é o melhor padrão agora: mais rápido, com autofix e config única. Permaneça no Flake8 (ou rode-o em paralelo) apenas por plugins que o Ruff ainda não cobre.