[PYTHON] Annoncez intelligemment qu'il s'agit d'une implémentation obsolète --debtcollerctor

Il y a des avertissements en python pour informer l'utilisateur du module des classes et méthodes obsolètes.

Lorsque vous exécutez le code ci-dessous

# -*- coding: utf-8 -*-
import warnings


def deprecated_method():
    warn_msg = "`deprecated_method` is deprecated and will be removed in v0.5"
    warnings.warn(warn_msg, UserWarning)
    print "I'm old"


if __name__ == '__main__':
    deprecated_method()

Vous verrez des avertissements comme indiqué ci-dessous.

$ python warning_sample.py 
warning_sample.py:7: UserWarning: `deprecated_method` is deprecated and will be removed in v0.5
  warnings.warn(warn_msg, UserWarning)
I'm old

Cette fois, je voudrais vous présenter deptcollector qui facilite la rédaction de ce message obsolète.

Comment utiliser le collecteur de créances

Surtout, vous pouvez regarder Exemples, mais je vais l'essayer moi-même. ..

obsolète pour classe, calssmethod, méthode, fonction

Si la méthode de la classe est obsolète, utilisez le décorateur @ removeals.remove comme indiqué ci-dessous.

# -*- coding: utf-8 -*-
from debtcollector import removals
import warnings

warnings.simplefilter('always')


class Car(object):
    @removals.remove
    def start(self):
        pass


if __name__ == '__main__':
    Car().start()

Le résultat de l'exécution est le suivant.

$ python removals_sample.py 
removals_sample.py:15: DeprecationWarning: Using function/method 'Car.start()' is deprecated
  Car().start()

Pourquoi ai-je besoin de warnings.simplefilter ('always') dans mon code?

Par défaut, @ removeals.remove n'est pas affiché car DeprecationWarning est passé à warnings.warn et exécuté. Pour plus de détails, voir Catégorie d'avertissement dans les avertissements.

Vous pouvez également afficher l'avertissement sur la ligne de commande en spécifiant l'option -W sans l'écrire dans le code. Supprimez warnings.simplefilter ('always') du code source précédent et exécutez comme suit.

$ python -Wd removals_sample.py

... omis file, filename, etc = imp.find_module(subname, path) removals_sample.py:15: DeprecationWarning: Using function/method 'Car.start()' is deprecated Car().start()

D'autres avertissements ont été affichés avec l'erreur Car (). Start (). Si vous créez votre propre bibliothèque, etc., vous voudrez peut-être l'essayer une fois.

L'avertissement à la classe est écrit comme suit.

@removals.remove
class Pinto(object):
    pass

Pour les méthodes de classe, placez-le au-dessus du décorateur @classmethod.

 class OldAndBusted(object):
    @removals.remove
    @classmethod
    def fix_things(cls):
        pass

Lorsque la méthode, la propriété, la classe, le mot-clé, etc. changent en d'autres noms

Lorsque le nom de la fonction change, utilisez moves.moved_function.

# -*- coding: utf-8 -*-
from debtcollector import moves
import warnings
warnings.simplefilter('always')


def new_thing():
    return "new thing"

old_thing = moves.moved_function(new_thing, 'old_thing', __name__)


if __name__ == '__main__':
    print new_thing()
    print old_thing()

Lorsque vous l'exécutez, vous pouvez voir que la nouvelle méthode est appelée même si vous appelez old_thing ().

$ python moving_sample.py 
new thing
moving_sample.py:15: DeprecationWarning: Function '__main__.old_thing()' has moved to '__main__.new_thing()'
  print old_thing()
new thing

Dans le cas de la méthode, vous pouvez le faire avec un décorateur.

class Cat(object):
    @moves.moved_method('meow')
    def mewow(self):
        return self.meow()
    def meow(self):
        return 'kitty'

Pour plus d'exemples, consultez le lien introduit au début.

Spécifiez une version qui sera remplacée à l'avenir

Pour spécifier la version actuelle et la version à remplacer, spécifiez les mots-clés version et remove_version comme suit:

# -*- coding: utf-8 -*-
from debtcollector import moves
import warnings
warnings.simplefilter('always')


def new_thing():
    return "new thing"

old_thing = moves.moved_function(new_thing, 'old_thing', __name__,
                                 version="0.5", removal_version="0.7")


if __name__ == '__main__':
    print new_thing()
    print old_thing()

Le résultat de l'exécution est le suivant.

$ python moving_version_sample.py 
new thing
moving_version_sample.py:16: DeprecationWarning: Function '__main__.old_thing()' has moved to '__main__.new_thing()' in version '0.5' and will be removed in version '0.7'
  print old_thing()
new thing

Autres méthodes

Vous pouvez également émettre un message dans la méthode comme suit.

import debtcollector
debtcollector.deprecate("This is no longer supported", version="1.0")

Résumé

Avec ** deptcollector **, il semble que les utilisateurs puissent être avertis intelligemment des méthodes obsolètes simplement en utilisant un décorateur.

Recommended Posts

Annoncez intelligemment qu'il s'agit d'une implémentation obsolète --debtcollerctor
N'est-il pas recommandé d'utiliser pip directement?
mecab-python3 semble avoir besoin de unique-lite
On dit que libmysqlclient.so.18 n'existe pas
C'est une histoire de ferroutage sur le service qui renvoie "Nyan" lorsque vous appuyez sur ping