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.

No related posts.

flattr this!

7 comments

  1. OK pour préférer warning à logging, mais tu préfères ça à un décorateur ?

  2. Un décorateur ?

    Je ne comprends pas.

    Donnes-moi un exemple de ce que tu compares.

  3. Pardon. Je pensais à quelque chose comme ça : http://code.activestate.com/recipes/577819-deprecated-decorator/
    J’ai déjà croisé ça dans des codes et je me dis que c’est une solution concurrente à la tienne (mais je peux me tromper). Quels sont les bons et mauvais cotés ?
    Merci.

  4. 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.

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

  6. 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.

  7. 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 ?

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent