SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
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!

Más contenido relacionado

La actualidad más candente

Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonPriscila Mayumi
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python Andreas Schreiber
 
Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!Flávio Pimenta
 
001 linux revision
001 linux revision001 linux revision
001 linux revisionSherif Mousa
 
Palestra "SCADA Ransomware"
Palestra "SCADA Ransomware"Palestra "SCADA Ransomware"
Palestra "SCADA Ransomware"TI Safe
 
版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub維佋 唐
 
Quasar Framework - Front end de alto desempenho
Quasar Framework - Front end de alto desempenhoQuasar Framework - Front end de alto desempenho
Quasar Framework - Front end de alto desempenhoPatrick Monteiro
 
Python Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdfPython Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdfMarioAthayde
 
Introduce to Rust-A Powerful System Language
Introduce to Rust-A Powerful System LanguageIntroduce to Rust-A Powerful System Language
Introduce to Rust-A Powerful System Language安齊 劉
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em pythonAlvaro Oliveira
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기Chris Ohk
 
Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Ippon
 
Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...
Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...
Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...Jackson Meires
 
Introdução à Programação Python e Tk
Introdução à Programação Python e TkIntrodução à Programação Python e Tk
Introdução à Programação Python e TkCarlos Campani
 
버전관리시스템 종류와 소개
버전관리시스템 종류와 소개버전관리시스템 종류와 소개
버전관리시스템 종류와 소개Jong-il Seok
 

La actualidad más candente (20)

Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação Python
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python
 
Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!Construir microservices em python nunca foi tão simples como com o Nameko!
Construir microservices em python nunca foi tão simples como com o Nameko!
 
Git 101 for Beginners
Git 101 for Beginners Git 101 for Beginners
Git 101 for Beginners
 
001 linux revision
001 linux revision001 linux revision
001 linux revision
 
Rust vs C++
Rust vs C++Rust vs C++
Rust vs C++
 
Palestra "SCADA Ransomware"
Palestra "SCADA Ransomware"Palestra "SCADA Ransomware"
Palestra "SCADA Ransomware"
 
版本控制 使用Git & git hub
版本控制   使用Git & git hub版本控制   使用Git & git hub
版本控制 使用Git & git hub
 
Quasar Framework - Front end de alto desempenho
Quasar Framework - Front end de alto desempenhoQuasar Framework - Front end de alto desempenho
Quasar Framework - Front end de alto desempenho
 
Python Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdfPython Introdução e Orientação a Objetos.pdf
Python Introdução e Orientação a Objetos.pdf
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Introduce to Rust-A Powerful System Language
Introduce to Rust-A Powerful System LanguageIntroduce to Rust-A Powerful System Language
Introduce to Rust-A Powerful System Language
 
Introdução a estruturas de dados em python
Introdução a estruturas de dados em pythonIntrodução a estruturas de dados em python
Introdução a estruturas de dados em python
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
 
Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014Formation GIT gratuite par ippon 2014
Formation GIT gratuite par ippon 2014
 
Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...
Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...
Oficina: Introdução à programação com Python e seus recursos: algoritmos e ló...
 
Introdução à Programação Python e Tk
Introdução à Programação Python e TkIntrodução à Programação Python e Tk
Introdução à Programação Python e Tk
 
버전관리시스템 종류와 소개
버전관리시스템 종류와 소개버전관리시스템 종류와 소개
버전관리시스템 종류와 소개
 
Introdução a python
Introdução a pythonIntrodução a python
Introdução a python
 

Destacado

04 programando em python - listas
 04   programando em python - listas 04   programando em python - listas
04 programando em python - listasVictor Marcelino
 
17 arvores binarias de busca
17   arvores binarias de busca17   arvores binarias de busca
17 arvores binarias de buscaRicardo Bolanho
 
Operações em Árvores Binárias
Operações em Árvores BináriasOperações em Árvores Binárias
Operações em Árvores Bináriaselliando dias
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano 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
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeRegis 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 BrazilFATEC São José dos Campos
 
What Makes Great Infographics
What Makes Great InfographicsWhat Makes Great Infographics
What Makes Great InfographicsSlideShare
 
Masters of SlideShare
Masters of SlideShareMasters of SlideShare
Masters of SlideShareKapost
 
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 SlideshareEmpowered Presentations
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation OptimizationOneupweb
 

Destacado (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
 
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!
 
10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization10 Ways to Win at SlideShare SEO & Presentation Optimization
10 Ways to Win at SlideShare SEO & Presentation Optimization
 

Similar 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 pythontdc-globalcode
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Swift na linha de comando
Swift na linha de comandoSwift na linha de comando
Swift na linha de comandoTales 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, PHPNGiMasters
 
Desenvolvimento de Software I - USBWEBSERVER - PHP
Desenvolvimento de Software I - USBWEBSERVER - PHPDesenvolvimento de Software I - USBWEBSERVER - PHP
Desenvolvimento de Software I - USBWEBSERVER - PHPAndré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 ComposeStefan 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 PHPArlindo Santos
 
Ideais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriverIdeais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriverStefan Teixeira
 
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 CodeIgniterEric Silva
 
Comandos gerais do PHP
Comandos gerais do PHPComandos gerais do PHP
Comandos gerais do PHPPaulo Dayvson
 
Linguagem de Programação Python
Linguagem de Programação PythonLinguagem de Programação Python
Linguagem de Programação PythonJunior Sobrenome
 
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êsHelio Colombe
 
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.0Jonh Edson
 

Similar 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
 
Linguagem de Programação Python
Linguagem de Programação PythonLinguagem de Programação Python
Linguagem de Programação Python
 
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
 
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.