Achei algo interessante no livro que estou lendo (Automatize tarefas maçantes com Python) e resolvi compartilhar.
Trata-se do Logging, que ajuda no debug do programa.
Vejam o exemplo nesse programa, com falha:
importlogginglogging.basicConfig(level=logging.DEBUG,format=' %(asctime)s - %(levelname)s - %(message)s')logging.debug('Start of program')deffactorial(n):logging.debug('Start of factorial(%s%%)'%(n))total=1foriinrange(n+1):total*=ilogging.debug('i is '+str(i)+', total is '+str(total))logging.debug('End of factorial(%s%%)'%(n))returntotalprint(factorial(5))logging.debug('End of program')
O programa retorna:
2016-11-1516:17:30,339-DEBUG-Startofprogram2016-11-1516:17:30,340-DEBUG-Startoffactorial(5%)2016-11-1516:17:30,340-DEBUG-iis0,totalis02016-11-1516:17:30,340-DEBUG-iis1,totalis02016-11-1516:17:30,340-DEBUG-iis2,totalis02016-11-1516:17:30,340-DEBUG-iis3,totalis02016-11-1516:17:30,340-DEBUG-iis4,totalis02016-11-1516:17:30,340-DEBUG-iis5,totalis02016-11-1516:17:30,340-DEBUG-Endoffactorial(5%)2016-11-1516:17:30,340-DEBUG-Endofprogram0
Dessa forma, podemos ver o passo a passo que o programa está realizando e identificar onde está o erro. No caso, vemos que para corrigir o problema, devemos alterar o for i in range(n+1): para for i in range(1, n+1):. Quando o desenvolvedor não quiser mais visualizar as mensagens de logging, basta chamar logging.disable(logging.CRITICAL) logo embaixo do import logging. Essa função faz com que não seja necessário alterar o programa removendo todas as chamadas de logging manualmente.
Também é possível gravar as mensagens de log num arquivo, ao invés de mostrá-las na tela. A função aceita o argumento filename.
importlogginglogging.basicConfig(filename='myProgramLog.txt',level=logging.DEBUG,format=' %(asctime)s - %(levelname)s - %(message)s')
Lado negativo do uso dessa função: a leitura do código fica difícil, por causa desse monte de logging.debug no meio do código. Para evitar isso, pode-se usar um decorator.