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?
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é
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
.
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")
>>>