SlideShare ist ein Scribd-Unternehmen logo
1 von 28
Downloaden Sie, um offline zu lesen
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!

Weitere ähnliche Inhalte

Was ist angesagt?

Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosAula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosDaniel Brandão
 
Fluxo de Processos do Guia PMBOK® – 6ª Edição
Fluxo de Processos do Guia PMBOK® – 6ª EdiçãoFluxo de Processos do Guia PMBOK® – 6ª Edição
Fluxo de Processos do Guia PMBOK® – 6ª EdiçãoRicardo Viana Vargas
 
Git utilisation quotidienne
Git   utilisation quotidienneGit   utilisation quotidienne
Git utilisation quotidienneSylvain Witmeyer
 
Palestra sobre Gerenciamento de Projetos
Palestra sobre Gerenciamento de ProjetosPalestra sobre Gerenciamento de Projetos
Palestra sobre Gerenciamento de ProjetosJET e-Commerce
 
Presentation DevOps : enjeux , objectifs, consequences
Presentation DevOps : enjeux , objectifs, consequencesPresentation DevOps : enjeux , objectifs, consequences
Presentation DevOps : enjeux , objectifs, consequencesStéphane Di Cioccio
 
GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)
GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)
GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)Phil Wilkins
 
CI-Jenkins.pptx
CI-Jenkins.pptxCI-Jenkins.pptx
CI-Jenkins.pptxMEDOBEST1
 
Gerenciamento de tempo em projetos
Gerenciamento de tempo em projetosGerenciamento de tempo em projetos
Gerenciamento de tempo em projetosPaulo Junior
 
Aula1 - Gerenciamento de Projetos
Aula1 - Gerenciamento de ProjetosAula1 - Gerenciamento de Projetos
Aula1 - Gerenciamento de ProjetosMairaM
 
Aula04 - EAP e Cronograma
Aula04 - EAP e CronogramaAula04 - EAP e Cronograma
Aula04 - EAP e CronogramaDaniela Brauner
 
Saa s software como serviço (slides)
Saa s   software como serviço (slides)Saa s   software como serviço (slides)
Saa s software como serviço (slides)Daniela Nunes
 

Was ist angesagt? (20)

Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando ArquivosAula 04 PHP - Utilizando Funções e Manipulando Arquivos
Aula 04 PHP - Utilizando Funções e Manipulando Arquivos
 
JSP: Introdução Parte 1
JSP: Introdução Parte 1JSP: Introdução Parte 1
JSP: Introdução Parte 1
 
Github in Action
Github in ActionGithub in Action
Github in Action
 
Fluxo de Processos do Guia PMBOK® – 6ª Edição
Fluxo de Processos do Guia PMBOK® – 6ª EdiçãoFluxo de Processos do Guia PMBOK® – 6ª Edição
Fluxo de Processos do Guia PMBOK® – 6ª Edição
 
Git utilisation quotidienne
Git   utilisation quotidienneGit   utilisation quotidienne
Git utilisation quotidienne
 
Palestra sobre Gerenciamento de Projetos
Palestra sobre Gerenciamento de ProjetosPalestra sobre Gerenciamento de Projetos
Palestra sobre Gerenciamento de Projetos
 
Presentation DevOps : enjeux , objectifs, consequences
Presentation DevOps : enjeux , objectifs, consequencesPresentation DevOps : enjeux , objectifs, consequences
Presentation DevOps : enjeux , objectifs, consequences
 
Devops and git basics
Devops and git basicsDevops and git basics
Devops and git basics
 
Pmbok
PmbokPmbok
Pmbok
 
GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)
GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)
GitHub Actions - using Free Oracle Cloud Infrastructure (OCI)
 
GIT Básico
GIT BásicoGIT Básico
GIT Básico
 
Tutorial Git
Tutorial GitTutorial Git
Tutorial Git
 
CI-Jenkins.pptx
CI-Jenkins.pptxCI-Jenkins.pptx
CI-Jenkins.pptx
 
Gerenciamento de tempo em projetos
Gerenciamento de tempo em projetosGerenciamento de tempo em projetos
Gerenciamento de tempo em projetos
 
Aula1 - Gerenciamento de Projetos
Aula1 - Gerenciamento de ProjetosAula1 - Gerenciamento de Projetos
Aula1 - Gerenciamento de Projetos
 
Gestão de projetos
Gestão de projetosGestão de projetos
Gestão de projetos
 
Aula04 - EAP e Cronograma
Aula04 - EAP e CronogramaAula04 - EAP e Cronograma
Aula04 - EAP e Cronograma
 
Git
GitGit
Git
 
Saa s software como serviço (slides)
Saa s   software como serviço (slides)Saa s   software como serviço (slides)
Saa s software como serviço (slides)
 
Aprendendo Git
Aprendendo GitAprendendo Git
Aprendendo Git
 

Andere mochten auch

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
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
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
 

Andere mochten auch (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!
 

Ähnlich wie 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
 

Ähnlich wie 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.