118 votes

warnings.warn() vs. logging.warning()

Quelle est la différence entre warnings.warn() y logging.warn() en termes de rôle et d'utilisation ?

4 votes

En cette réponse : "logging.warn est obsolète depuis Python 3.3 et vous devriez utiliser logging.warning."

122voto

cxrodgers Points 3167

Je suis d'accord avec l'autre réponse -- logging est destiné à l'enregistrement et warning est un avertissement, mais j'aimerais ajouter plus de détails.

Voici un tutoriel qui vous guidera à travers les étapes de l'utilisation de la fonction logging module. https://docs.python.org/3/howto/logging.html

Il répond directement à votre question :

warnings.warn() dans le code de la bibliothèque si le problème peut être évité et que l'application client est en mesure de le résoudre. 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 la situation, mais l'événement doit tout de même être noté

85voto

Mark Amery Points 4705

logging.warning enregistre juste quelque chose au WARNING de la même manière que logging.info des journaux à l'adresse INFO et logging.error des journaux à l'adresse ERROR niveau. Il n'a pas de comportement particulier.

warnings.warn émet un Warning qui peut être imprimé à l'adresse suivante stderr ou ignoré complètement, ou encore jeté comme un objet normal. Exception (ce qui risque de faire planter votre application), en fonction de la nature précise de la Warning émise et la façon dont vous avez configuré votre sous-classe Filtre d'avertissements . Par défaut, les avertissements sont imprimés sur stderr ou ignorés.

Avertissements émis par warnings.warn sont souvent utiles à connaître, mais faciles à manquer (surtout si vous exécutez un programme Python dans un processus en arrière-plan et que vous n'avez pas capturé stderr ). C'est pourquoi il peut être utile de les consigner.

Python fournit une intégration intégrée entre le logging et le module warnings pour vous permettre de le faire ; il suffit d'appeler logging.captureWarnings(True) au début de votre script et tous les avertissements émis par la fonction warnings sera automatiquement enregistré au niveau WARNING .

41voto

Iceberg Points 919

En plus de la explication canonique dans la documentation officielle

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

logging.warning() si l'application cliente ne peut rien faire pour remédier à la situation, mais que l'événement doit tout de même être noté

Il convient également de noter que, par défaut, le système warnings.warn("same message") n'apparaîtra qu'une seule fois. Il s'agit là d'une différence notable. Citation de document officiel

Les répétitions d'un avertissement particulier pour le même emplacement de la 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")

2 votes

Notez que "n'apparaître qu'une seule fois" est le comportement par défaut prévu, mais les filtres d'avertissement peuvent le modifier.

-12voto

Ignacio Vazquez-Abrams Points 312628

L'une d'entre elles lève une exception qui peut être levée ou ignorée, et l'autre ajoute optionnellement une entrée dans le journal en fonction du niveau de journalisation actuel. L'une doit être utilisée lorsque l'on est averti de diverses choses dans le code, et l'autre doit être utilisée lors de la journalisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X