Assegure a qualidade do seu código Python - Prospector

Logo do Python

Mais um ano, mais um post sobre ferramentas de qualidade de código. Opções não faltam quando o assunto é Python, e elas são dos mais variados fins e complexidade. Com tanta opção, não seria interessante ter "um anel para a todos governar"?

Tanto é interessante que um utilitário vem fazendo parte do toolbelt dos desenvolvedores Python nos últimos tempos justamente por desempenhar esse papel. Estamos falando, claro, do Prospector.

One ring to rule them all

O Prospector é uma ferramenta livre, que analisa código Python e retorna informações sobre potenciais problemas, erros de convenção de código, alertas sobre complexidade, etc.

Sauron faz um anel para juntar a todos. Bem parecido com a ideia do prospector (lego-lord-of-the-rings.wikia.com)

Ela agrega a funcionalidade de outras ferramentas de análise, como Pylint e pep8, e disponibiliza algumas configurações padrões, permitindo assim um bom balanço entre cobertura x configuração.

O "lema" do Prospector é ser "out of the box". Segundo a documentação oficial:

A common complaint of other Python analysis tools is that it takes a long time to filter through which errors are relevant or interesting to your own coding style. Prospector provides some default profiles, which hopefully will provide a good starting point and will be useful straight away, and adapts the output depending on the libraries your project uses.

No terminal

Para começar, precisamos instalar a ferramenta:

$ pip install prospector

Por padrão o Prospector utiliza os seguintes utilitários "under the hood":

Mas alguns extras (como mypy) também estão disponíveis para instalação. Confira a lista completa de ferramentas suportadas.

Ao executá-lo, ele apontará possíveis problemas em seu projeto:

$ prospector

Messages
========

my_app/views.py
  Line: 1
    pylint: unused-import / Unused render imported from django.shortcuts

manage.py
  Line: 10
    pylint: import-outside-toplevel / Import outside toplevel (django.core.management) (col 8)

my_project/settings.py
  Line: 23
    dodgy: secret / Possible hardcoded secret key

my_second_app/views.py
  Line: 1
    pylint: unused-import / Unused render imported from django.shortcuts



Check Information
=================
         Started: 2020-01-21 11:06:04.832118
        Finished: 2020-01-21 11:06:07.455090
      Time Taken: 2.62 seconds
       Formatter: grouped
        Profiles: default, no_doc_warnings, no_test_warnings, strictness_medium, strictness_high, strictness_veryhigh, no_member_warnings
      Strictness: None
  Libraries Used: django
       Tools Run: dodgy, mccabe, pep8, profile-validator, pyflakes, pylint
  Messages Found: 4

Ainda é possível aumentar o nível de rigorosidade:

$ prospector --strictness veryhigh

Utilizando-o com o pre-commit, tudo fica ainda mais dinâmico:

- repo: git://github.com/guykisel/prospector-mirror
  rev: "" # Use the sha / tag you want to point at
  hooks:
    - id: prospector

No VS Code

Admito que conheci o Prospector por causa do VS Code, e utilizá-lo com o editor é tão simples quanto o seu uso via linha de comando. Basta adicionar ao seu settings.json as seguintes diretivas:

{
  "python.linting.enabled": true,
  "python.linting.prospectorEnabled": true
}

E após o editor resolver as dependências, ele passa a funcionar quase que magicamente.

Exemplo de uso do Prospector + Dodgy + VS Code

Considerações finais

Se você já está cansado de configurar diferentes ferramentas de linting Python, o Prospector pode ser um bom utilitário para manter por perto.

Tenho problemas com a "verbosidade" dele, mas acho que ele funciona bem com editores como o VS Code (por exemplo). Se você quiser ser altamente criterioso em relação ao seu código, vale muito a pena testá-lo em seu processo de pre-commit e durante o build no CI.

Até a próxima.

Referências