¿Cuál es la diferencia entre warnings.warn()
y logging.warn()
en términos de lo que hacen y cómo deben usarse?
¿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.
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
o logging
?
Estoy de acuerdo con la otra respuesta: logging
es para registrar y warning
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.html
Responde directamente a su pregunta:
warnings.warn () en el código de la biblioteca si el problema se puede evitar y la aplicación cliente debe modificarse para eliminar la advertencia
logging.warning () si no hay nada que la aplicación cliente pueda hacer sobre la situación, pero el evento aún debe anotarse
logging.warning
simplemente registra algo en el WARNING
nivel, de la misma manera que logging.info
registra en el INFO
nivel y logging.error
registra en el ERROR
nivel. No tiene ningún comportamiento especial.
warnings.warn
emite un Warning
, que puede imprimirse stderr
, ignorarse por completo o lanzarse como de costumbre Exception
(posiblemente bloqueando su aplicación) dependiendo de la Warning
subclase precisa emitida y cómo haya configurado su filtro de advertencias . De forma predeterminada, las advertencias se imprimirán stderr
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 capturando stderr
). Por esa razón, puede resultar útil tenerlos registrados.
Python proporciona una integración incorporada entre el logging
módulo y el warnings
módulo para permitirle hacer esto; simplemente llame logging.captureWarnings(True)
al inicio de su script y todas las advertencias emitidas por el warnings
módulo se registrarán automáticamente en el nivel WARNING
.
Además de la explicación canónica en la documentación oficial
warnings.warn () en el código de la biblioteca si el problema se puede evitar y la aplicación cliente debe modificarse para eliminar la advertencia
logging.warning () si no hay nada que la aplicación cliente pueda hacer sobre la situación, pero el evento aún debe anotarse
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
Por lo general, se suprimen las repeticiones de una advertencia particular para la misma ubicación de origen.
>>> 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")
>>>