¿Cuál es la diferencia entre warnings.warn()y logging.warn()en términos de lo que hacen y cómo deben usarse?
82
¿Cuál es la diferencia entre warnings.warn()y logging.warn()en términos de lo que hacen y cómo deben usarse?
Respuestas:
Uno genera una excepción que puede detectarse o ignorarse según se desee, y el otro opcionalmente agrega una entrada al registro según el nivel de registro actual. Uno debe usarse cuando uno advierte sobre varias cosas en el código, y el otro debe usarse al iniciar sesión.
fuente
logging.captureWarnings()). Los mensajes de advertencia se muestran por defecto solo una vez, como explicó @cxrodgers para decirle al usuario que cambie su código. Iniciar sesión en el otro y documentar todas las advertencias, sin embargo, se puede configurar qué mostrar en detalle. Las advertencias pueden elevarse a excepciones usando "-W error".warningsologging?Estoy de acuerdo con la otra respuesta:
logginges para registrar ywarninges para advertir, pero me gustaría agregar más detalles.Aquí hay un CÓMO estilo tutorial que lo guía a través de los pasos para usar el
loggingmódulo. https://docs.python.org/3/howto/logging.htmlResponde directamente a su pregunta:
fuente
logging.warningsimplemente registra algo en elWARNINGnivel, de la misma manera quelogging.inforegistra en elINFOnivel ylogging.errorregistra en elERRORnivel. No tiene ningún comportamiento especial.warnings.warnemite unWarning, que puede imprimirsestderr, ignorarse por completo o lanzarse como de costumbreException(posiblemente bloqueando su aplicación) dependiendo de laWarningsubclase precisa emitida y cómo haya configurado su filtro de advertencias . De forma predeterminada, las advertencias se imprimiránstderro se ignorarán.warnings.warnA menudo es útil conocer las advertencias emitidas por , pero es fácil pasarlas por alto (especialmente si está ejecutando un programa Python en un proceso en segundo plano y no capturandostderr). Por esa razón, puede resultar útil tenerlos registrados.Python proporciona una integración incorporada entre el
loggingmódulo y elwarningsmódulo para permitirle hacer esto; simplemente llamelogging.captureWarnings(True)al inicio de su script y todas las advertencias emitidas por elwarningsmódulo se registrarán automáticamente en el nivelWARNING.fuente
Además de la explicación canónica en la documentación oficial
También vale la pena señalar que, de forma predeterminada
warnings.warn("same message"), solo se mostrará una vez. Esa es una diferencia notable importante. Citado del documento oficial>>> import warnings >>> warnings.warn("foo") __main__:1: UserWarning: foo >>> warnings.warn("foo") >>> warnings.warn("foo") >>> >>> import logging >>> logging.warn("bar") WARNING:root:bar >>> logging.warn("bar") WARNING:root:bar >>> logging.warn("bar") WARNING:root:bar >>> >>> >>> warnings.warn("fur") __main__:1: UserWarning: fur >>> warnings.warn("fur") >>> warnings.warn("fur") >>>fuente