Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Análise estática de código Python

1,484 views

Published on

Talk realizada na Python Brasil 2015 sobre ferramentas de análise de código em Python

Published in: Software
  • Be the first to comment

Análise estática de código Python

  1. 1. Análise estática de código Python Guilherme Vierno PythonBrasil 2015 vierno.com.br
  2. 2. Python é dinâmico # teste.py import abc def SOMAR(a, b): return a + c … $ python -m teste
  3. 3. 500 Internal Server Error Your webserver at port 80
  4. 4. 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
  5. 5. Existem ferramentas que podem fazer isso!
  6. 6. 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
  7. 7. Mas pra quê? • Time-saver • Segurança • Manutenabilidade • Conformidade
  8. 8. Vamos às ferramentas Para instalar alguma delas: $ pip install slide_title
  9. 9. 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
  10. 10. pep8 import json def a(x): # expected 2 blank lines, found 1 if x <> 0: # '<>' is deprecated, use '!=' json.dumps( '{}') # whitespace after '('
  11. 11. 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
  12. 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. 13. flake8 • Combina as ferramentas pep8 e pyflakes e mccabe • Vem com hook para git e hg • Pode excluir linhas como comment: # noqa
  14. 14. 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
  15. 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. 16. 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
  17. 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. 18. pep257 • Verifica a presença de docstrings de acordo com a PEP257 • Possui plugin para o flake8
  19. 19. 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)
  20. 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. 21. 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'
  22. 22. 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)
  23. 23. É fácil integrá-las ao seu fluxo de trabalho!
  24. 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. 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. 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. 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. 28. Obrigado!

×