Je dois marquer les routines comme obsolètes, mais apparemment, il n'y a pas de décorateur de bibliothèque standard pour la désapprobation. Je connais les recettes et le module d'avertissement, mais ma question est: pourquoi n'y a-t-il pas de décorateur de bibliothèque standard pour cette tâche (commune)?
Question supplémentaire: y a-t-il des décorateurs standard dans la bibliothèque standard?
Réponses:
Voici un extrait de code, modifié de ceux cités par Leandro:
Parce que dans certains interprètes, la première solution exposée (sans gestion de filtre) peut entraîner une suppression d'avertissement.
la source
functools.wraps
plutôt que de définir le nom et le document comme ça?Voici une autre solution:
Ce décorateur (une usine de décorateurs en fait) vous permet de donner un message de raison . Il est également plus utile d'aider le développeur à diagnostiquer le problème en donnant le nom du fichier source et le numéro de ligne .
EDIT : Ce code utilise la recommandation de Zero: il remplace la
warnings.warn_explicit
ligne parwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
, qui imprime le site d'appel de fonction plutôt que le site de définition de fonction. Cela facilite le débogage.EDIT2 : Cette version permet au développeur de spécifier un message optionnel "raison".
Vous pouvez utiliser ce décorateur pour les fonctions , les méthodes et les classes .
Voici un exemple simple:
Tu auras:
EDIT3: Ce décorateur fait maintenant partie de la bibliothèque obsolète:
Nouvelle version stable v1.2.10 🎉
la source
warn_explicit
ligne parwarnings.warn(msg, category=DeprecationWarning, stacklevel=2)
laquelle imprime le site d'appel de fonction plutôt que le site de définition de fonction. Cela facilite le débogage.Comme muon l'a suggéré , vous pouvez installer le
deprecation
package pour cela.Installation
Exemple d'utilisation
Voir http://deprecation.readthedocs.io/ pour la documentation complète.
la source
Je suppose que la raison est que le code Python ne peut pas être traité de manière statique (comme cela a été le cas pour les compilateurs C ++), vous ne pouvez pas être averti de l'utilisation de certaines choses avant de l'utiliser. Je ne pense pas que ce soit une bonne idée de spammer l'utilisateur de votre script avec un tas de messages "Attention: ce développeur de ce script utilise une API obsolète".
Mise à jour: mais vous pouvez créer un décorateur qui transformera la fonction d'origine en une autre. La nouvelle fonction marquera / vérifiera le commutateur indiquant que cette fonction a déjà été appelée et affichera un message uniquement lors de la mise en marche du commutateur. Et / ou à la sortie, il peut afficher la liste de toutes les fonctions obsolètes utilisées dans le programme.
la source
Vous pouvez créer un fichier utils
Et puis importez le décorateur d'obsolescence comme suit:
la source
MISE À JOUR: Je pense que c'est mieux, lorsque nous affichons DeprecationWarning uniquement la première fois pour chaque ligne de code et lorsque nous pouvons envoyer un message:
Résultat:
Nous pouvons simplement cliquer sur le chemin d'avertissement et aller à la ligne dans PyCharm.
la source
En augmentant cette réponse de Steven Vascellaro :
Si vous utilisez Anaconda, installez d'abord le
deprecation
package:Ensuite, collez ce qui suit en haut du fichier
Voir http://deprecation.readthedocs.io/ pour la documentation complète.
la source