Análise estática de código Python

Post on 08-Feb-2017

640 views 3 download

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

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

Python é dinâmico# teste.pyimport abc

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

$ python -m teste

500 Internal Server ErrorYour webserver at port 80

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

Existem ferramentas que podem fazer isso!

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

Mas pra quê?

• Time-saver

• Segurança

• Manutenabilidade

• Conformidade

Vamos às ferramentas

Para instalar alguma delas: $ pip install slide_title

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

pep8

import json

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

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

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'

flake8

• Combina as ferramentas pep8 e pyflakes e mccabe

• Vem com hook para git e hg

• Pode excluir linhas como comment: # noqa

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

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

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

pylint

import abc # Unused import abc

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

pep257

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

• Possui plugin para o flake8

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)

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()

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'

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)

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

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]

• …

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.

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

Recap

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

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

• Automatize o processo.

Obrigado!