Warning technique à un autre développeur en Python


Une dépendance optionnelle est manquante. Une fonction est dépréciée. Une syntaxe n’est pas recommandée.

Il y a mieux qu’un print() pour signaler ça à votre utilisateur.

import warnings
 
# on definit quels types de warning on va afficher (a faire une seule fois)
warnings.simplefilter("always")
 
# et on affiche tous nos warning
warnings.warn("La fonction je_vais_a_une_boom() est depreciee", DeprecationWarning)
warnings.warn("Le module optionnel 'braces' n'est pas disponible", ImportWarning)
# ne mettez pas de caracteres non ASCII, sinon ca chie
 
## /home/Sam/Bureau/test.py:8: DeprecationWarning: La fonction je_vais_a_une_boom() est depreciee
##   warnings.warn("La fonction je_vais_a_une_boom() est depreciee", DeprecationWarning)
## /home/Sam/Bureau/test.py:9: ImportWarning: Le module optionnel 'braces' n'est pas disponible
##   warnings.warn("Le module optionnel 'braces' n'est pas disponible", ImportWarning)

L’avantage d’utiliser le module warning est :

  • Il affiche sur stderr automatiquement.
  • Il affiche un format clair automatiquement (fichier, ligne, type de warning).
  • On peut très vite lire le code source et voir ce qui déclenche un warning.

Mais surtout, on peut filtrer les warning:

warnings.simplefilter("type de filtrage")

Le module permet de choisir ce qu’on affiche comme warning. Ils sont désactivables par la ligne de commande. Et surtout, quelqu’un qui importe votre module qui balance des warnings possède de nombreux moyens de les réduire au silence ou de les rediriger ailleurs. Par exemple :

with warnings.catch_warnings(record=True) as w:
     import test

Vous trouverez ici un liste des warnings disponibles ainsi que les filtres possibles.

9 thoughts on “Warning technique à un autre développeur en Python

  • Sam Post author

    Un décorateur ?

    Je ne comprends pas.

    Donnes-moi un exemple de ce que tu compares.

  • Sam Post author

    Solution concurrente ? A ma solution ? J’ai pas proposé de solution, je présente un module. Module qui est utilisé dans le décorateur vers lequel tu link. Je pige pas le commentaire.

    Mais bon snippet au demeurant. Activatestate est une bonne source en général.

  • François

    Oui, d’accord. Bon, c’est pas grave, c’est peut être moi qui suis à coté de la plaque aujourd’hui :)

  • kontre

    Il y a un équivalent à l’argument stacklevel pour les exceptions ? J’ai fouillé un peu sans rien trouver d’approchant. J’imagine que “explicite est mieux qu’implicite” et que donc on ne veut pas cacher la provenance exacte de l’exception, mais ça peut permettre de simplifier agréablement la longueur du traceback balancé à la gueule de l’utilisateur final.

  • Sam Post author

    Hello @kontre,

    Je ne conprends pas la question (décidément c’est le fil rouge des comments :-)), de quelle situation parles-tu ? Peux-tu donner un exemple ?

  • guilhem

    Est-ce qu’on peut s’en servir pour donner de l’élan à un pigeon?

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.