Análise estática de
código Python
Guilherme Vierno
PythonBrasil 2015 vierno.com.br
Python é dinâmico
# teste.py
import abc
def SOMAR(a, b):
return a + c
…
$ python -m teste
500 Internal Server Error
Your 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 key
DBNAME = '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!

Análise estática de código Python

  • 1.
    Análise estática de códigoPython Guilherme Vierno PythonBrasil 2015 vierno.com.br
  • 2.
    Python é dinâmico #teste.py import abc def SOMAR(a, b): return a + c … $ python -m teste
  • 3.
    500 Internal ServerError Your webserver at port 80
  • 4.
    Análise estática import abc defSOMAR(a, b): return a + c Import não-usado Violação de convenção NameError: Variável não encontrada
  • 5.
  • 6.
    Como? • O códigofonte é 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
  • 7.
    Mas pra quê? •Time-saver • Segurança • Manutenabilidade • Conformidade
  • 8.
    Vamos às ferramentas Parainstalar alguma delas: $ pip install slide_title
  • 9.
    pep8 • Checa aconformidade 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
  • 10.
    pep8 import json def a(x):# expected 2 blank lines, found 1 if x <> 0: # '<>' is deprecated, use '!=' json.dumps( '{}') # whitespace after '('
  • 11.
    pyflakes • Realiza checagemde erros • Rápido, analisa a árvore de arquivos individuais • Emite poucos falso-positivos • Não tem grande abrangência de erros
  • 12.
    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'
  • 13.
    flake8 • Combina asferramentas pep8 e pyflakes e mccabe • Vem com hook para git e hg • Pode excluir linhas como comment: # noqa
  • 14.
    mccabe • Mede acomplexidade ciclomática de métodos, classes, funções e módulos • Pode ser utilizado como um plugin do flake8 ou standalone
  • 15.
    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
  • 16.
    pylint • Padrões decó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
  • 17.
    pylint import abc #Unused import abc def SOMAR(a, b): # Invalid function name "SOMAR" # Missing function docstring return a + c # Undefined variable 'c'
  • 18.
    pep257 • Verifica apresença de docstrings de acordo com a PEP257 • Possui plugin para o flake8
  • 19.
    pep257 def foo(): "This isjust 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)
  • 20.
    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()
  • 21.
    dodgy • Procura porcó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 key DBNAME = 'blah'
  • 22.
    prospector • Agrupa váriasferramentas 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)
  • 23.
    É fácil integrá-lasao seu fluxo de trabalho!
  • 24.
    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] • …
  • 25.
    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.
  • 26.
    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
  • 27.
    Recap • Utilize ferramentas:elas podem salvar seu pescoço. • Integre a checagem e as métricas ao seu workflow diário. • Automatize o processo.
  • 28.