He estado codificando mucho en Python últimamente. Y he estado trabajando con datos con los que no había trabajado antes, usando fórmulas nunca antes vistas y tratando con archivos enormes. Todo esto me hizo escribir muchas declaraciones impresas para verificar si todo va bien e identificar los puntos de falla. Pero, en general, generar tanta información no es una buena práctica. ¿Cómo utilizo las declaraciones de impresión solo cuando quiero depurar y permitir que se omitan cuando no quiero que se impriman?
109
level
, en labasicConfig
llamada, alogging.ERROR
.logging.basicConfig(stream=sys.stderr, level=logging.ERROR)
no tendrá ningún efecto. Reiniciar el kernel y configurar el nuevo nivel funciona, pero esa es una solución para mí.Una forma sencilla de hacer esto es llamar a una función de registro:
Luego, puede cambiar el valor de
DEBUG
y ejecutar su código con o sin registro.El
logging
módulo estándar tiene un mecanismo más elaborado para esto.fuente
logging
funciona (a un nivel muy simple).Utilice el módulo de biblioteca integrado de registro en lugar de imprimir.
Creas un
Logger
objeto (por ejemplologger
), y luego, cada vez que insertas una impresión de depuración, simplemente pones:Puede utilizar
logger.setLevel
al inicio del programa para establecer el nivel de salida. Si lo configura en DEBUG, imprimirá todas las depuraciones. Configúrelo en INFO o superior e inmediatamente todas las depuraciones desaparecerán.También puedes usarlo para registrar cosas más serias, en diferentes niveles (INFO, ADVERTENCIA y ERROR).
fuente
En primer lugar, respaldaré la nominación del marco de registro de Python . Sin embargo, tenga un poco de cuidado con la forma en que lo usa. Específicamente: deje que el marco de registro amplíe sus variables, no lo haga usted mismo. Por ejemplo, en lugar de:
asegúrese de hacer:
porque aunque se ven similares, la primera versión incurre en el costo repr () incluso si está deshabilitada . La segunda versión evita esto. Del mismo modo, si lanza el suyo, sugeriría algo como:
llamado a través de:
que, de nuevo, evitará la sobrecarga si la desactiva haciendo:
La sobrecarga de calcular esas cadenas probablemente no importe a menos que sean 1) costosas de calcular o 2) la declaración de depuración esté en medio de, digamos, un ciclo n ^ 3 o algo así. No es que yo sepa nada de eso.
fuente
No sé sobre otros, pero estaba acostumbrado a definir una "constante global" (
DEBUG
) y luego una función global (debug(msg)
) que se imprimiríamsg
solo siDEBUG == True
.Luego escribo mis declaraciones de depuración como:
... luego retomé las pruebas unitarias y ¡nunca volví a hacer esto! :)
fuente
print()
mi código al nivel requerido para pasar la prueba. Nunca termino con una gran cantidad deprint()
cosas por todos lados. ¡La tala también es genial! :)