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.
Surtout, vous pouvez regarder Exemples, mais je vais l'essayer moi-même. ..
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 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.
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
Vous pouvez également émettre un message dans la méthode comme suit.
import debtcollector
debtcollector.deprecate("This is no longer supported", version="1.0")
Avec ** deptcollector **, il semble que les utilisateurs puissent être avertis intelligemment des méthodes obsolètes simplement en utilisant un décorateur.
Recommended Posts