web-dev-qa-db-fra.com

Python warnings.warn () contre logging.warning ()

Quelle est la différence entre warnings.warn() et logging.warn() en termes de ce qu'ils font et comment ils doivent être utilisés?

62
hekevintran

L'un déclenche une exception qui peut être interceptée ou ignorée comme vous le souhaitez, et l'autre ajoute éventuellement une entrée au journal en fonction du niveau de journalisation actuel. L'un doit être utilisé lorsque l'un avertit de diverses choses dans le code, et l'autre doit être utilisé lors de la journalisation.

Je suis d'accord avec l'autre réponse - logging est pour la journalisation et warning est pour l'avertissement - mais je voudrais ajouter plus de détails.

Voici un HOWTO de style didacticiel qui vous guide tout au long des étapes d'utilisation du module logging. http://docs.python.org/2/howto/logging.html

Il répond directement à votre question:

warnings.warn () dans le code de la bibliothèque si le problème est évitable et que l'application cliente doit être modifiée pour éliminer l'avertissement

logging.warning () s'il n'y a rien que l'application cliente puisse faire à propos de la situation, mais l'événement doit quand même être noté

51
cxrodgers

logging.warning enregistre simplement quelque chose au niveau WARNING, de la même manière que logging.info Enregistre au niveau INFO et logging.error Se connecte au niveau ERROR. Il n'a pas de comportement particulier.

warnings.warn émet un Warning , qui peut être imprimé sur stderr, ignoré complètement ou jeté comme un normal Exception (pouvant planter votre application) en fonction de la sous-classe Warning précise émise et de la façon dont vous avez configuré votre filtre d'avertissements . Par défaut, les avertissements seront imprimés dans stderr ou ignorés.

Les avertissements émis par warnings.warn Sont souvent utiles à connaître, mais faciles à manquer (surtout si vous exécutez un programme Python en arrière-plan et ne capturez pas stderr). Pour cette raison, il peut être utile de les enregistrer. Python fournit une intégration intégrée entre le module logging et le warnings pour vous permettre de le faire, appelez simplement logging.captureWarnings(True) au début de votre script et tous les avertissements émis par le module warnings seront automatiquement enregistrés au niveau WARNING.

30
Mark Amery

Outre le explication canonique dans la documentation officielle

warnings.warn () dans le code de la bibliothèque si le problème est évitable et que l'application cliente doit être modifiée pour éliminer l'avertissement

logging.warning () s'il n'y a rien que l'application cliente puisse faire à propos de la situation, mais l'événement doit quand même être noté

Il convient également de noter que, par défaut, warnings.warn("same message") n'apparaîtra qu'une seule fois. C'est une différence notable notable. Cité de doc officiel

Les répétitions d'un avertissement particulier pour le même emplacement source sont généralement supprimées.

>>> 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")
>>>
16
RayLuo