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
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)
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.