Análise estática de código Python
-
Upload
guilherme-vierno -
Category
Software
-
view
640 -
download
3
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!