Como melhorar a qualidade do código com linting em Python
Keshav Malik
12 de outubro de 2022
0 minutos de leituraPython é uma linguagem em constante crescimento. À medida que ela evolui e se expande, também aumenta o número de ferramentas e estratégias de desenvolvimento disponíveis para trabalhar com ela. Um processo que vem ganhando popularidade é o linting, ou seja, a verificação do código em busca de possíveis problemas. Com o linting, os erros no código são sinalizados para que possamos corrigir práticas de programação incomuns que poderiam causar problemas.
O linting é feito enquanto o código-fonte está sendo escrito, antes de ele ser compilado. Em outras palavras, é uma verificação pré-build, também chamada de “análise estática de código”. Verificar o código regularmente com linting garante consistência em todo o código e na base de código. Isso reduz as chances de pequenos erros se transformarem em problemas complexos depois que o código é executado.
Muitos desenvolvedores não usam linting porque não percebem o valor que ele agrega, já que não impede bugs. Mas essa visão subestima o quanto o linting pode melhorar a qualidade do código.
Neste artigo prático, vamos explorar como é rápido e fácil fazer verificações de linting em Python com o Pylint, uma das ferramentas de linting mais populares. Também veremos como o linting pode ajudar você a seguir o guia de estilo de código PEP8.
Pré-requisitos
Antes de começar, confira se você tem:
Python e pip instalados na sua máquina
Conhecimentos básicos sobre interfaces de linha de comando (CLIs)
Conhecimento de conceitos de Python, como funções e classes
Observe também que, embora os comandos apresentados aqui sejam compatíveis com sistemas Linux e macOS, é preciso ter cuidado ao trabalhar com Windows.
Fazendo linting de código Python
Antes de mostrar como usar um linter em Python, vamos preparar o ambiente criando um diretório e um ambiente virtual.
Configurando o ambiente
Primeiro, crie um diretório para o projeto. Neste tutorial, vamos chamá-lo de pylint-demo.
Em seguida, crie um ambiente virtual. Ele vai isolar as dependências do projeto e evitar conflitos com outros projetos.
O prompt deve ficar parecido com: (pylint-demo) $. Isso indica que o ambiente virtual está ativo.
Com o ambiente virtual ativo, instale o linter com o comando a seguir:
Agora podemos executar o linter com o comando pylint. Para confirmar que o Pylint foi instalado corretamente, execute o seguinte comando:
Primeiros passos com linting
Vamos escrever um programa Python básico e usar o Pylint nele para ver como funciona. Crie um arquivo main.py e copie o código a seguir:
No código acima, adicionamos uma função para verificar se um número é par ou ímpar. Para usar o Pylint e verificar se há erros nesse código, executamos o seguinte comando:
A saída do Pylint é a seguinte:
Podemos identificar vários problemas autoexplicativos no código, cada um identificado por um código, como C0304. O Pylint atribui uma letra a cada erro para diferenciar a gravidade e a natureza do problema. Há cinco categorias de erros:
C: Convenção (para violações de convenções de código)
R: Refatoração (para problemas relacionados a code smells e refatoração)
W: Aviso (para problemas de programação que não são erros)
E: Erro (para problemas de programação que são erros)
F: Fatal (para problemas graves que interromperam a execução do Pylint)
O Pylint também atribui ao código uma nota de 0 a 10, com base no número de erros encontrados.
No nosso exemplo, todos os códigos de erro, exceto um, indicam problemas de convenção; o único restante é um aviso. Para corrigir esses problemas, vamos fazer algumas alterações no código e executar o Pylint novamente para ver que nota ele recebe.
Nesse código, adicionamos docstrings ao módulo e à função, inserimos uma nova linha no final e renomeamos a variável do código anterior. Ao executar o Pylint novamente, recebemos nota 10/10, sem nenhum problema.
Executando o Pylint em um único arquivo
Agora que entendemos melhor como o Pylint funciona, vamos ver outro exemplo. Digite o código a seguir:
Neste trecho, temos uma classe simples chamada animal e um objeto dessa classe chamado obj1. Agora, vamos usar o Pylint nesse código.
Observe que, desta vez, os problemas de qualidade do código deram lugar a erros mais substanciais. Com os problemas sinalizados, vamos tentar corrigi-los com o código abaixo:
Em seguida, execute o Pylint novamente. Depois de mudar o nome da classe de animal para Animal, adicionar uma docstring à classe, remover argumentos desnecessários das chamadas de função e incluir a indentação correta, quase eliminamos todos os erros do código. Ainda resta um:
Vamos ver como corrigir esse erro restante. O Pylint informa que não temos dois ou mais métodos públicos, mas é bem provável que nosso código realmente não tenha dois ou mais métodos públicos. Então, como corrigimos isso?
Nesse caso, podemos usar comentários em Python para suprimir esses problemas. A sintaxe para fazer isso é:
Veja como ficará o código:
Ao verificar a saída do Pylint agora, veremos que o problema desapareceu.
Executando o Pylint em um diretório
Vimos como executar o Pylint em um único arquivo, mas, ao trabalhar em um projeto, não teremos apenas um arquivo para verificar. Precisaremos fazer linting do diretório.
Para usar o Pylint em todo o diretório, execute o seguinte comando:
Para ver como funciona o linting de um diretório, vamos criar mais dois arquivos e adicionar algum código.
Mova o arquivo main.py para o diretório src e cole o código a seguir nos respectivos arquivos:
Temos três arquivos no diretório src: main.py, helpers.py e config.py. Em main.py, temos uma função fictícia que exibe se estamos conectados ao banco de dados. O arquivo helpers.py contém uma função auxiliar fictícia para conectar ao banco de dados, e o arquivo config.py contém o nome de usuário e a senha do banco de dados.
Agora, vamos executar o Pylint em todo o diretório usando o seguinte comando a partir do diretório raiz:
A saída do comando será:
Como podemos ver, o Pylint exibe os resultados de arquivos diferentes, separados por *** e pelo nome do módulo. Para corrigir os problemas, precisamos fazer as seguintes alterações:
Adicione uma nova linha no final de cada arquivo.
Adicione uma docstring a cada arquivo e função.
Altere a instrução
importdehelpers import connect_dbpara.helpers import connect_db.
Depois de corrigir esses problemas, encontraremos outro: precisamos colocar em maiúscula o nome da variável is_connected. Podemos mudar o nome da variável ou suprimir o aviso para lidar com esse erro.
Suprimindo avisos
É bem provável que você precise personalizar ou suprimir vários avisos ao fazer linting do seu código Python. Não faz sentido adicionar um comentário a cada vez. Em vez de suprimir os avisos um por um, você pode criar um arquivo .rc para personalizar o comportamento do Pylint e suprimir os avisos do projeto inteiro diretamente nesse arquivo .rc.
Você pode criar um arquivo desse tipo com o seguinte comando:
Código melhor e mais seguro com linting
O linting em Python verifica o código-fonte enquanto ele é escrito e sinaliza erros, antes da execução. Você também pode integrar o Pylint aos editores para ver os resultados do linting em tempo real.
Embora o linting não corrija bugs automaticamente, usá-lo de forma consistente ajuda a manter a alta qualidade do código. Por isso, mesmo que alguns desenvolvedores considerem o linting uma perda de tempo, ele é muito eficaz para detectar pequenos problemas antes que se transformem em problemas maiores.
Ao longo deste artigo, vimos como o linting e a aplicação das recomendações do Pylint melhoraram nosso código de exemplo. Além disso, esse processo ajuda a seguir o guia de estilo PEP8. Agora que você sabe como implementar o linting nos seus projetos, pode explorar as diversas ferramentas disponíveis e descobrir qual delas complementa melhor — e aprimora — sua abordagem ao desenvolvimento em Python.
Comece a jogar Capture the Flag
Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.


