J'ai beaucoup codé en Python ces derniers temps. Et j'ai travaillé avec des données avec lesquelles je n'avais jamais travaillé auparavant, en utilisant des formules jamais vues auparavant et en traitant d'énormes fichiers. Tout cela m'a fait écrire beaucoup de déclarations imprimées pour vérifier si tout va bien et identifier les points de défaillance. Mais, généralement, produire autant d'informations n'est pas une bonne pratique. Comment utiliser les instructions d'impression uniquement lorsque je veux déboguer et les laisser être ignorées lorsque je ne veux pas qu'elles soient imprimées?
109
level
, dans l'basicConfig
appel, surlogging.ERROR
.logging.basicConfig(stream=sys.stderr, level=logging.ERROR)
n'aura aucun effet. Redémarrer le noyau et définir le nouveau niveau fonctionne, mais c'est une solution de contournement pour moi.Un moyen simple de le faire est d'appeler une fonction de journalisation:
Ensuite, vous pouvez modifier la valeur de
DEBUG
et exécuter votre code avec ou sans journalisation.Le
logging
module standard a un mécanisme plus élaboré pour cela.la source
logging
fonctionne (à un niveau très simple).Utilisez le module de bibliothèque intégré de journalisation au lieu d'imprimer.
Vous créez un
Logger
objet (par exemplelogger
), puis après cela, chaque fois que vous insérez une impression de débogage, vous venez de mettre:Vous pouvez utiliser
logger.setLevel
au début du programme pour régler le niveau de sortie. Si vous le définissez sur DEBUG, il affichera tous les débogages. Réglez-le sur INFO ou supérieur et immédiatement tous les débogages disparaîtront.Vous pouvez également l'utiliser pour enregistrer des choses plus sérieuses, à différents niveaux (INFO, WARNING et ERROR).
la source
Tout d'abord, je seconderai la nomination du framework de journalisation de python . Faites cependant attention à la façon dont vous l'utilisez. Plus précisément: laissez le cadre de journalisation étendre vos variables, ne le faites pas vous-même. Par exemple, au lieu de:
assurez-vous de faire:
car bien qu'elles se ressemblent, la première version entraîne le coût de repr () même si elle est désactivée . La deuxième version évite cela. De même, si vous roulez le vôtre, je suggérerais quelque chose comme:
appelé via:
ce qui, encore une fois, évitera la surcharge si vous le désactivez en faisant:
La surcharge de calcul de ces chaînes n'a probablement pas d'importance à moins qu'elles ne soient 1) coûteuses à calculer ou 2) l'instruction de débogage se trouve au milieu, par exemple, d'une boucle n ^ 3 ou quelque chose du genre. Non pas que je sache quoi que ce soit à ce sujet.
la source
Je ne sais pas pour les autres, mais j'ai été utilisé pour définir une "constante globale" (
DEBUG
) puis une fonction globale (debug(msg)
) qui ne s'imprimeraitmsg
que siDEBUG == True
.Ensuite, j'écris mes instructions de débogage comme:
... puis j'ai repris les tests unitaires et je n'ai plus jamais fait ça! :)
la source
print()
amener mon code au niveau requis pour réussir le test. Je ne me retrouve jamais avec une énorme quantité deprint()
partout. La journalisation est cool aussi! :)