warnings.warn () frente a logging.warning ()

Respuestas:

-5

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.

Ignacio Vázquez-Abrams
fuente
23
Hasta donde tengo entendido, la respuesta aceptada es incorrecta. Ni las advertencias ni el registro generan una excepción. Pero imprima mensajes. Sin embargo, tienen una sistemática diferente (sin embargo, es posible integrar advertencias en el registro a través de 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".
DerWeh
Lamento decir que esta respuesta no es muy útil. "uno sube ..." y "uno debe ..."? ¿Cual es cual? warningso logging?
Peter Lillevold hace
86

Estoy de acuerdo con la otra respuesta: logginges para registrar y warninges 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.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

cxrodgers
fuente
60

logging.warningsimplemente registra algo en el WARNINGnivel, de la misma manera que logging.inforegistra en el INFOnivel y logging.errorregistra en el ERRORnivel. No tiene ningún comportamiento especial.

warnings.warnemite un Warning, que puede imprimirse stderr, ignorarse por completo o lanzarse como de costumbre Exception(posiblemente bloqueando su aplicación) dependiendo de la Warningsubclase precisa emitida y cómo haya configurado su filtro de advertencias . De forma predeterminada, las advertencias se imprimirán stderro 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 capturando stderr). Por esa razón, puede resultar útil tenerlos registrados.

Python proporciona una integración incorporada entre el loggingmódulo y el warningsmódulo para permitirle hacer esto; simplemente llame logging.captureWarnings(True)al inicio de su script y todas las advertencias emitidas por el warningsmódulo se registrarán automáticamente en el nivel WARNING.

Mark Amery
fuente
27

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")
>>>
RayLuo
fuente
1
Tenga en cuenta que "aparecer solo una vez" es el comportamiento predeterminado previsto, pero los filtros de advertencia pueden cambiar esto.
gerrit