Ultimamente, tenho programado muito em Python. E tenho trabalhado com dados com os quais não trabalhei antes, usando fórmulas nunca vistas antes e lidando com arquivos enormes. Tudo isso me fez escrever várias declarações impressas para verificar se está tudo certo e identificar os pontos de falha. Mas, geralmente, emitir tantas informações não é uma boa prática. Como uso as instruções de impressão apenas quando quero depurar e deixo que sejam ignoradas quando não quero que sejam impressas?
109
level
, nabasicConfig
chamada, paralogging.ERROR
.logging.basicConfig(stream=sys.stderr, level=logging.ERROR)
não terá efeito. Reiniciar o kernel e definir o novo nível funciona, mas isso é uma solução alternativa para mim.Uma maneira simples de fazer isso é chamar uma função de registro:
Em seguida, você pode alterar o valor de
DEBUG
e executar seu código com ou sem registro.O
logging
módulo padrão possui um mecanismo mais elaborado para isso.fonte
logging
funciona (em um nível muito simples).Use o módulo de biblioteca integrado de registro em vez de imprimir.
Você cria um
Logger
objeto (digamoslogger
) e, depois disso, sempre que inserir uma impressão de depuração, basta colocar:Você pode usar
logger.setLevel
no início do programa para definir o nível de saída. Se você configurá-lo para DEBUG, ele imprimirá todas as depurações. Defina-o como INFO ou superior e imediatamente todas as depurações desaparecerão.Você também pode usá-lo para registrar coisas mais sérias, em diferentes níveis (INFO, WARNING e ERROR).
fonte
Em primeiro lugar, vou apoiar a nomeação do framework de registro de python . No entanto, tenha um pouco de cuidado ao usá-lo. Especificamente: deixe a estrutura de registro expandir suas variáveis, não faça você mesmo. Por exemplo, em vez de:
certifique-se de fazer:
porque embora pareçam semelhantes, a primeira versão incorre no custo repr (), mesmo se estiver desabilitada . A segunda versão evita isso. Da mesma forma, se você lançar o seu próprio, sugiro algo como:
chamado via:
o que, novamente, evitará a sobrecarga se você desativá-lo fazendo:
A sobrecarga de computação dessas strings provavelmente não importa, a menos que sejam 1) caras de calcular ou 2) a instrução de depuração esteja no meio de, digamos, um loop n ^ 3 ou algo assim. Não que eu soubesse algo sobre isso.
fonte
Não sei sobre outros, mas estava acostumado a definir uma "constante global" (
DEBUG
) e, em seguida, uma função global (debug(msg)
) que seria impressamsg
apenas seDEBUG == True
.Em seguida, escrevo minhas instruções de depuração como:
... então pego o teste de unidade e nunca mais fiz isso! :)
fonte
print()
leva apenas alguns minutos para colocar meu código no nível necessário para passar no teste. Eu nunca acabo com uma grande quantidade deprint()
por todo o lugar. Registrar também é legal! :)