SlideShare uma empresa Scribd logo
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!

Mais conteúdo relacionado

Mais procurados

KMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろーKMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろー
kyoto university
 
String matching algorithms
String matching algorithmsString matching algorithms
String matching algorithms
Dr Shashikant Athawale
 
Geometric algorithms
Geometric algorithmsGeometric algorithms
Geometric algorithms
Ganesh Solanke
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
 
Best Practices - Software Engineering
Best Practices - Software EngineeringBest Practices - Software Engineering
Best Practices - Software Engineering
3Quill Softwares
 
katagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 cryptokatagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 crypto
trmr
 
Rust、何もわからない...#7 VecDeque再訪
Rust、何もわからない...#7 VecDeque再訪Rust、何もわからない...#7 VecDeque再訪
Rust、何もわからない...#7 VecDeque再訪
Yusuke Mori
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
AtCoder Inc.
 
Bdd Introduction
Bdd IntroductionBdd Introduction
Bdd Introduction
Skills Matter
 
Pseudo code
Pseudo codePseudo code
Pseudo code
Arindam Ghosh
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
AtCoder Inc.
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
AtCoder Inc.
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
Masahiro Sakai
 
CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説
AtCoder Inc.
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
AtCoder Inc.
 
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
Yuto Takei
 
Presentation of daa on approximation algorithm and vertex cover problem
Presentation of daa on approximation algorithm and vertex cover problem Presentation of daa on approximation algorithm and vertex cover problem
Presentation of daa on approximation algorithm and vertex cover problem
sumit gyawali
 
Semantic analysis
Semantic analysisSemantic analysis
Semantic analysis
Lahore Garrison University
 
AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説
AtCoder Inc.
 

Mais procurados (20)

KMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろーKMC 競技プログラミング練習会 Advanced 第3回 ふろー
KMC 競技プログラミング練習会 Advanced 第3回 ふろー
 
String matching algorithms
String matching algorithmsString matching algorithms
String matching algorithms
 
Geometric algorithms
Geometric algorithmsGeometric algorithms
Geometric algorithms
 
並行プログラミングと継続モナド
並行プログラミングと継続モナド並行プログラミングと継続モナド
並行プログラミングと継続モナド
 
Best Practices - Software Engineering
Best Practices - Software EngineeringBest Practices - Software Engineering
Best Practices - Software Engineering
 
katagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 cryptokatagaitai CTF勉強会 #3 crypto
katagaitai CTF勉強会 #3 crypto
 
Rust、何もわからない...#7 VecDeque再訪
Rust、何もわからない...#7 VecDeque再訪Rust、何もわからない...#7 VecDeque再訪
Rust、何もわからない...#7 VecDeque再訪
 
AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説AtCoder Beginner Contest 021 解説
AtCoder Beginner Contest 021 解説
 
Bdd Introduction
Bdd IntroductionBdd Introduction
Bdd Introduction
 
Pseudo code
Pseudo codePseudo code
Pseudo code
 
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
 
AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説AtCoder Beginner Contest 016 解説
AtCoder Beginner Contest 016 解説
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
 
CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説CODE FESTIVAL 予選B 解説
CODE FESTIVAL 予選B 解説
 
Topdown parsing
Topdown parsingTopdown parsing
Topdown parsing
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
 
Presentation of daa on approximation algorithm and vertex cover problem
Presentation of daa on approximation algorithm and vertex cover problem Presentation of daa on approximation algorithm and vertex cover problem
Presentation of daa on approximation algorithm and vertex cover problem
 
Semantic analysis
Semantic analysisSemantic analysis
Semantic analysis
 
AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説AtCoder Beginner Contest 026 解説
AtCoder Beginner Contest 026 解説
 

Destaque

04 programando em python - listas
 04   programando em python - listas 04   programando em python - listas
04 programando em python - listas
Victor Marcelino
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de busca
Ricardo Bolanho
 
TWP45 Hackeando o Facebook com Python
TWP45 Hackeando o Facebook com PythonTWP45 Hackeando o Facebook com Python
TWP45 Hackeando o Facebook com Python
FATEC São José dos Campos
 
Operações em Árvores Binárias
Operações em Árvores BináriasOperações em Árvores Binárias
Operações em Árvores Binárias
elliando dias
 
TWP20 For Funções e Random
TWP20 For Funções e RandomTWP20 For Funções e Random
TWP20 For Funções e Random
FATEC São José dos Campos
 
TWP05 Variáveis e Entrada de Dados
TWP05 Variáveis e Entrada de DadosTWP05 Variáveis e Entrada de Dados
TWP05 Variáveis e Entrada de Dados
FATEC São José dos Campos
 
Para gostar de Python DevDay
Para gostar de Python DevDay Para gostar de Python DevDay
Para gostar de Python DevDay
FATEC São José dos Campos
 
Lista de exercícios IV python para zumbis
Lista de exercícios IV python para zumbisLista de exercícios IV python para zumbis
Lista de exercícios IV python para zumbis
FATEC São José dos Campos
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
Luciano Ramalho
 
Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)
Marcelo Barros de Almeida
 
Recursividade
RecursividadeRecursividade
Recursividade
Sérgio Souza Costa
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
Regis Magalhães
 
import pybr12: experiencias de inclusión en la última PyCon Brazil
import pybr12: experiencias de inclusión en la última PyCon Brazilimport pybr12: experiencias de inclusión en la última PyCon Brazil
import pybr12: experiencias de inclusión en la última PyCon Brazil
FATEC São José dos Campos
 
Estrutura de dados - Árvores Binárias
Estrutura de dados - Árvores BináriasEstrutura de dados - Árvores Binárias
Estrutura de dados - Árvores Binárias
Adriano Teixeira de Souza
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
Luciano Ramalho
 
Aprendendo python
Aprendendo pythonAprendendo python
Aprendendo python
Victor Marcelino
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great Infographics
SlideShare
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
Kapost
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
Empowered Presentations
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
Jesse Desjardins - @jessedee
 

Destaque (20)

04 programando em python - listas
 04   programando em python - listas 04   programando em python - listas
04 programando em python - listas
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de busca
 
TWP45 Hackeando o Facebook com Python
TWP45 Hackeando o Facebook com PythonTWP45 Hackeando o Facebook com Python
TWP45 Hackeando o Facebook com Python
 
Operações em Árvores Binárias
Operações em Árvores BináriasOperações em Árvores Binárias
Operações em Árvores Binárias
 
TWP20 For Funções e Random
TWP20 For Funções e RandomTWP20 For Funções e Random
TWP20 For Funções e Random
 
TWP05 Variáveis e Entrada de Dados
TWP05 Variáveis e Entrada de DadosTWP05 Variáveis e Entrada de Dados
TWP05 Variáveis e Entrada de Dados
 
Para gostar de Python DevDay
Para gostar de Python DevDay Para gostar de Python DevDay
Para gostar de Python DevDay
 
Lista de exercícios IV python para zumbis
Lista de exercícios IV python para zumbisLista de exercícios IV python para zumbis
Lista de exercícios IV python para zumbis
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)Python para desenvolvedores - material apoio (parte I)
Python para desenvolvedores - material apoio (parte I)
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 
import pybr12: experiencias de inclusión en la última PyCon Brazil
import pybr12: experiencias de inclusión en la última PyCon Brazilimport pybr12: experiencias de inclusión en la última PyCon Brazil
import pybr12: experiencias de inclusión en la última PyCon Brazil
 
Estrutura de dados - Árvores Binárias
Estrutura de dados - Árvores BináriasEstrutura de dados - Árvores Binárias
Estrutura de dados - Árvores Binárias
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Aprendendo python
Aprendendo pythonAprendendo python
Aprendendo python
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great Infographics
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShare
 
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to SlideshareSTOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
STOP! VIEW THIS! 10-Step Checklist When Uploading to Slideshare
 
You Suck At PowerPoint!
You Suck At PowerPoint!You Suck At PowerPoint!
You Suck At PowerPoint!
 

Semelhante a Análise estática de código Python

utilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythonutilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em python
tdc-globalcode
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
Luciano Ramalho
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
Igor Sobreira
 
Python 08
Python 08Python 08
Python 08
Bruno Catão
 
Swift na linha de comando
Swift na linha de comandoSwift na linha de comando
Swift na linha de comando
Tales Andrade
 
Entendendo a linkedição em C++
Entendendo a linkedição em C++Entendendo a linkedição em C++
Entendendo a linkedição em C++
Rodrigo Strauss
 
Painel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGPainel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNG
iMasters
 
Desenvolvimento de Software I - USBWEBSERVER - PHP
Desenvolvimento de Software I - USBWEBSERVER - PHPDesenvolvimento de Software I - USBWEBSERVER - PHP
Desenvolvimento de Software I - USBWEBSERVER - PHP
Andréia Santos
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Stefan Teixeira
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Arlindo Santos
 
Ideais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriverIdeais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriver
Stefan Teixeira
 
Automatizando Nmap com NSE
Automatizando Nmap com NSEAutomatizando Nmap com NSE
Automatizando Nmap com NSE
Tiago Natel de Moura
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniter
Eric Silva
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
Paulo Dayvson
 
Zephir
ZephirZephir
Zephir
Luiz Gavinho
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsCurso de Python (Básico) - Português
Curso de Python (Básico) - Português
Helio Colombe
 
Linguagem de Programação Python
Linguagem de Programação PythonLinguagem de Programação Python
Linguagem de Programação Python
Junior Sobrenome
 
Python com baterias incluídas v2.0
Python com baterias incluídas v2.0Python com baterias incluídas v2.0
Python com baterias incluídas v2.0
Jonh Edson
 
Mean Stack
Mean StackMean Stack
Mean Stack
Bruno Catão
 
M2ti - Python Brasil
M2ti - Python BrasilM2ti - Python Brasil
M2ti - Python Brasil
Rodrigo Hübner
 

Semelhante a Análise estática de código Python (20)

utilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythonutilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em python
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Python 08
Python 08Python 08
Python 08
 
Swift na linha de comando
Swift na linha de comandoSwift na linha de comando
Swift na linha de comando
 
Entendendo a linkedição em C++
Entendendo a linkedição em C++Entendendo a linkedição em C++
Entendendo a linkedição em C++
 
Painel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGPainel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNG
 
Desenvolvimento de Software I - USBWEBSERVER - PHP
Desenvolvimento de Software I - USBWEBSERVER - PHPDesenvolvimento de Software I - USBWEBSERVER - PHP
Desenvolvimento de Software I - USBWEBSERVER - PHP
 
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker ComposeScrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
Scrum Gathering Rio 2016 - Conteinerizando Testes com Docker Compose
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Ideais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriverIdeais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriver
 
Automatizando Nmap com NSE
Automatizando Nmap com NSEAutomatizando Nmap com NSE
Automatizando Nmap com NSE
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniter
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHP
 
Zephir
ZephirZephir
Zephir
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsCurso de Python (Básico) - Português
Curso de Python (Básico) - Português
 
Linguagem de Programação Python
Linguagem de Programação PythonLinguagem de Programação Python
Linguagem de Programação Python
 
Python com baterias incluídas v2.0
Python com baterias incluídas v2.0Python com baterias incluídas v2.0
Python com baterias incluídas v2.0
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
M2ti - Python Brasil
M2ti - Python BrasilM2ti - Python Brasil
M2ti - Python Brasil
 

Análise estática de código Python

  • 1. Análise estática de código Python 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 Server Error Your webserver at port 80
  • 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
  • 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. Mas pra quê? • Time-saver • Segurança • Manutenabilidade • Conformidade
  • 8. Vamos às ferramentas Para instalar alguma delas: $ pip install slide_title
  • 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. 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 checagem de 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 as ferramentas pep8 e pyflakes e mccabe • Vem com hook para git e hg • Pode excluir linhas como comment: # noqa
  • 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. 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 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. 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 a presença de docstrings de acordo com a PEP257 • Possui plugin para o flake8
  • 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. 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 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. 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. É fácil integrá-las ao 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.