Aprimorando qualidade de código Python com black, flake8, isort e interrogate

Automatizando o pipeline de qualidade de código antes de dar o commit

Henrique Junqueira Branco
gb.tech
5 min readOct 4, 2022

--

Contexto

Ao commitar código Python usando o git, ferramenta de versionamento amplamente usada pela comunidade, é necessário garantir que o código:

  • tenha uma boa aparência (formatação);
  • esteja organizado;
  • esteja de acordo com o guia de estilo da PEP 8;
  • inclua documentação (docstring);

Porém, fazer essa checagem antes de cada commit é muito chato e entediante!

Não seria legal se essa tarefa repetitiva e maçante pudesse ser automatizada antes de cada commit?

É neste momento que o pre-commit vem a calhar!

O que é o pre-commit?

pre-commit é um framework que permite fazer várias verificações antes de commitar um código.

É possível adicionar diversos plugins ao seu pipeline de verificação do pre-commit. Quando um commit for dado, o pipeline roda todas as verificações e, se houver alguma falha, o commit não é feito, alertando o que está inconsistente.

É possível instalar o pre-commit da seguinte forma:

Maravilha! Basta agora alguns plugins ao pipeline de verificação do pre-commit.

black

O black é uma biblioteca que formata o código de acordo com a PEP 8.

Para instalar o black:

Ao aplicar o black em um arquivo ou pasta, ele formatará de forma automática.

Ao executar o comando acima, o black fará a formatação completa. É possível ver alguns exemplos da própria documentação oficial do black:

Outro exemplo:

Ou seja, não é necessário mais a preocupação com formatação do código.

Para adicionar o black ao pipeline do pre-commit é só criar um arquivo .pre-commit-config.yaml e colocar o código abaixo:

Para configurar quais arquivos serão inclusos ou não na verificação ao rodar o black, é possível criar um arquivo chamado pyproject.toml e colocar o seguinte trecho nele:

flake8

flake8 é uma framework que checa o estilo e qualidade de código Python. Ele verificar vários outros pontos não cobertos pelo black.

Para instalar o flake8:

Da mesma forma, é possível aplicar o flake8 da seguinte forma:

E para configurá-lo no pipeline do pre-commit, é só inserir o trecho abaixo no arquivo .pre-commit-config.yaml:

Da mesma forma que o black também é possível configurar o flake8 criando o arquivo .flake8 e inserindo o seguinte conteúdo nele:

isort

isort é uma biblioteca Python para formatar automaticamente as importações de acordo com a PEP 8: em ordem alfabética e organizada por seções e tipos.

Instalação do isort:

Aplicando o isort:

Da própria documentação do isort, temos o seguinte exemplo:

Antes da aplicação do isort

Após a aplicação do isort:

Observa-se que há uma organização completa dos imports por ordem alfabética e por seções:

  • funções built-in primeiro
  • pacotes externos na sequencia
  • somente depois módulos ou pacotes próprios

Para adicionar o isort ao pipeline do pre-commit, adiciona-se o trecho de código ao arquivo .pre-commit-config.yaml:

interrogate

interrogate é um framework para verificar a ausência de documentações (docstring) no código.

Para instalar:

É comum esquecer de documentar funções, classes e módulos com docstring, conforme o exemplo abaixo:

Ao invés de procurar manualmente por todas as docstrings esquecidas, podemos rodar o interrogate:

O terminal apresentará quais módulos, classes e funções não tem documentação. E agora basta adicionar as documentações ausentes.

A docstring do método __init__ ainda está ausente, porém não é necessária. É possível usar a flag -i para que o interrogate ignore-o:

Para adicionar o interrogate ao pipeline do pre-commit, adiciona-se o trecho de código ao arquivo .pre-commit-config.yaml:

Para editar as configurações padrão do interrogate basta adicioná-las ao arquivo pyproject.toml:

Último passo — adicionar o pre-commit aos hooks do git

Ao final, o arquivo .pre-commit-config.yaml terá o seguinte conteúdo:

Para adicionar o pre-commit aos hooks do git:

Em caso de sucesso, aparecerá a seguinte mensagem:

Commit

Basta commitar o código que todas as verificações serão feitas antes de o commit ser dado. Caso quaisquer uma das validações falhe, o commit é cancelado.

Pulando a verificação

Nem sempre deseja-se que a verificação seja feita. É possível adicionar a flag --no-verify ao commitar, para pular a verificação.

Resumo

  • Contextualização
  • Introdução ao pre-commit e seus hooks
  • Hook do black (formatação PEP 8)
  • Hook do flake 8 (qualidade de código)
  • Hook do isort (formatação de imports)
  • Hook do interrogate (documentação de código)
  • Adição de todos os hooks ao git
  • Commitando
  • Pulando a verificação

Gostou? Espero ter contribuido minimamente com sua jornada em qualidade de código!

--

--

Henrique Junqueira Branco
gb.tech

Life-time learner data scientist with great passion for new insights and technologies