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