¿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".warnings
ologging
?Estoy de acuerdo con la otra respuesta:
logging
es para registrar ywarning
es 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
logging
módulo. https://docs.python.org/3/howto/logging.htmlResponde directamente a su pregunta:
fuente
logging.warning
simplemente registra algo en elWARNING
nivel, de la misma manera quelogging.info
registra en elINFO
nivel ylogging.error
registra en elERROR
nivel. No tiene ningún comportamiento especial.warnings.warn
emite unWarning
, que puede imprimirsestderr
, ignorarse por completo o lanzarse como de costumbreException
(posiblemente bloqueando su aplicación) dependiendo de laWarning
subclase precisa emitida y cómo haya configurado su filtro de advertencias . De forma predeterminada, las advertencias se imprimiránstderr
o se ignorarán.warnings.warn
A 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
logging
módulo y elwarnings
módulo para permitirle hacer esto; simplemente llamelogging.captureWarnings(True)
al inicio de su script y todas las advertencias emitidas por elwarnings
mó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