Análise estática de código Python

28
Análise estática de código Python Guilherme Vierno PythonBrasil 2015 vierno.com.br

Transcript of Análise estática de código Python

Page 1: Análise estática de código Python

Análise estática de código PythonGuilherme Vierno PythonBrasil 2015 vierno.com.br

Page 2: Análise estática de código Python

Python é dinâmico# teste.pyimport abc

def SOMAR(a, b): return a + c…

$ python -m teste

Page 3: Análise estática de código Python

500 Internal Server ErrorYour webserver at port 80

Page 4: Análise estática de código Python

Análise estática

import abc

def SOMAR(a, b): return a + c

Import não-usado

Violação de convenção

NameError: Variável não encontrada

Page 5: Análise estática de código Python

Existem ferramentas que podem fazer isso!

Page 6: Análise estática de código Python

Como?• O código fonte é compilado em uma estrutura de

dados, a mais comum é a árvore sintática abstrata (módulo ast)

• A estrutura de dados é processada e opcionalmente anotada com informações da ferramenta

• A ferramenta realiza as checagens com a estrutura resultante

Page 7: Análise estática de código Python

Mas pra quê?

• Time-saver

• Segurança

• Manutenabilidade

• Conformidade

Page 8: Análise estática de código Python

Vamos às ferramentas

Para instalar alguma delas: $ pip install slide_title

Page 9: Análise estática de código Python

pep8• Checa a conformidade com a convenção PEP8:

Indentação, espaços, quebras de linha…

• Rápido e leve

• Disponível para praticamente qualquer editor

• Vários serviços online e ferramentas o utilizam

Page 10: Análise estática de código Python

pep8

import json

def a(x): # expected 2 blank lines, found 1 if x <> 0: # '<>' is deprecated, use '!=' json.dumps( '{}') # whitespace after '('

Page 11: Análise estática de código Python

pyflakes

• Realiza checagem de erros

• Rápido, analisa a árvore de arquivos individuais

• Emite poucos falso-positivos

• Não tem grande abrangência de erros

Page 12: Análise estática de código Python

pyflakes

import json # 'json' imported but unused

def foo(): var = 123 # local variable 'var' # is assigned to but never used return 123

fo() # undefined name 'fo'

Page 13: Análise estática de código Python

flake8

• Combina as ferramentas pep8 e pyflakes e mccabe

• Vem com hook para git e hg

• Pode excluir linhas como comment: # noqa

Page 14: Análise estática de código Python

mccabe

• Mede a complexidade ciclomática de métodos, classes, funções e módulos

• Pode ser utilizado como um plugin do flake8 ou standalone

Page 15: Análise estática de código Python

mccabe

# flake8 mccabe.py --max-complexity=3# mccabe.py:1:1: C901 'foo' is too complex (4)def foo(a, b, c): if a: return a if b: return b if c: return c

Page 16: Análise estática de código Python

pylint• Padrões de código: além espaços, checa também nomes de

variáveis.

• Confere presença de docstrings, erros e utilização de código

• Possui arquivo de configuração com muitas opções customizáveis (pylint —generate-rcfile)

• Entrega relatórios e guarda histórico

• Configs default muito estritas

• Pode gerar muitos falso-positivos

Page 17: Análise estática de código Python

pylint

import abc # Unused import abc

def SOMAR(a, b): # Invalid function name "SOMAR" # Missing function docstring return a + c # Undefined variable 'c'

Page 18: Análise estática de código Python

pep257

• Verifica a presença de docstrings de acordo com a PEP257

• Possui plugin para o flake8

Page 19: Análise estática de código Python

pep257

def foo(): "This is just a docstring for foo" return "Fu!"# First line should be in imperative mood# First line should end with a period (not 'o')# Use """triple double quotes""" (found '-quotes)

Page 20: Análise estática de código Python

vulture• Encontra classes, funções e variáveis não

utilizadas

def foo(a): return a

def bar(b): # Unused function 'bar' return b

print foo()

Page 21: Análise estática de código Python

dodgy• Procura por código que não deveria estar no

código

• Utiliza expressões regulares

• Passwords, secret keys, diffs…

ENGINE = 'sqlite3'DB_PASS = '123' # Possible hardcoded secret keyDBNAME = 'blah'

Page 22: Análise estática de código Python

prospector• Agrupa várias ferramentas para uma análise geral

do código com output unificado

• Defaults mais 'agradáveis'

• Possui níveis de rigor de checagem

• Checagem baseada em dependências (django e celery)

Page 23: Análise estática de código Python

É fácil integrá-las ao seu fluxo de trabalho!

Page 24: Análise estática de código Python

Seu editor suporta!• Vim: syntastic, flake8-vim

• Sublime: SublimeLinter, Anaconda, pep8

• PyCharm: motor próprio, pep8

• PyDev: motor próprio, pylint

• Atom: linter-[flake8, pylint, pep8]

• …

Page 25: Análise estática de código Python

Use as ferramentas!• Tire um tempo e crie configurações para as

ferramentas que irá utilizar.

• Crie ‘atalhos' para rodar as ferramentas (Makefile, shell script, app command…)

• As ferramentas podem ser usadas via código python, sendo fácil criar testes.

• Pre-commit hook: Realize todos os testes pertinentes e aborte o commit se o código não corresponder ao nível desejado.

Page 26: Análise estática de código Python

Automatize• Jenkins: plugin ‘violations’, pep8, pylint, prospector

• landscape.io: utiliza o prospector

• codeclimate.com, codacy.com: multi-linguagens, poucos checks Python

• quantifiedcode.com: possui linguagem própria para os checkers, sendo possível criar novos

Page 27: Análise estática de código Python

Recap

• Utilize ferramentas: elas podem salvar seu pescoço.

• Integre a checagem e as métricas ao seu workflow diário.

• Automatize o processo.

Page 28: Análise estática de código Python

Obrigado!