análise estática de código python
TRANSCRIPT
![Page 1: Análise estática de código Python](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/1.jpg)
Análise estática de código PythonGuilherme Vierno PythonBrasil 2015 vierno.com.br
![Page 2: Análise estática de código Python](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/2.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/3.jpg)
500 Internal Server ErrorYour webserver at port 80
![Page 4: Análise estática de código Python](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/5.jpg)
Existem ferramentas que podem fazer isso!
![Page 6: Análise estática de código Python](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/7.jpg)
Mas pra quê?
• Time-saver
• Segurança
• Manutenabilidade
• Conformidade
![Page 8: Análise estática de código Python](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/8.jpg)
Vamos às ferramentas
Para instalar alguma delas: $ pip install slide_title
![Page 9: Análise estática de código Python](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/9.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/10.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/11.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/17.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/18.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/19.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/21.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/22.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/23.jpg)
É fácil integrá-las ao seu fluxo de trabalho!
![Page 24: Análise estática de código Python](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/24.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/25.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/26.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/27.jpg)
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](https://reader031.vdocuments.mx/reader031/viewer/2022012323/589b25551a28ab2d4c8b4f61/html5/thumbnails/28.jpg)
Obrigado!