214 votes

décorateurs dans le python standard lib (@deprecated spécifiquement)

J'ai besoin de marquer les routines comme obsolètes, mais apparemment il n'y a pas de décorateur de bibliothèque standard pour la dépréciation. Je connais les recettes pour cela et le module d'avertissements, mais ma question est : pourquoi n'y a-t-il pas de décorateur de bibliothèque standard pour cette tâche (commune) ?

Question additionnelle : y a-t-il des décorateurs standards dans la bibliothèque standard ?

90voto

pbertoni Points 50

Voici quelques extraits, modifiés de ceux cités par Leandro :

import warnings
import functools

def deprecated(func):
    """This is a decorator which can be used to mark functions
    as deprecated. It will result in a warning being emitted
    when the function is used."""
    @functools.wraps(func)
    def new_func(*args, **kwargs):
        warnings.simplefilter('always', DeprecationWarning)  # turn off filter
        warnings.warn("Call to deprecated function {}.".format(func.__name__),
                      category=DeprecationWarning,
                      stacklevel=2)
        warnings.simplefilter('default', DeprecationWarning)  # reset filter
        return func(*args, **kwargs)
    return new_func

# Examples

@deprecated
def some_old_function(x, y):
    return x + y

class SomeClass:
    @deprecated
    def some_old_method(self, x, y):
        return x + y

Parce que dans certains interprètes, la première solution exposée (sans manipulation du filtre) peut entraîner une suppression de l'avertissement.

19voto

Erika Dsouza Points 171

Vous pouvez créer un fichier utils

import warnings

def deprecated(message):
  def deprecated_decorator(func):
      def deprecated_func(*args, **kwargs):
          warnings.warn("{} is a deprecated function. {}".format(func.__name__, message),
                        category=DeprecationWarning,
                        stacklevel=2)
          warnings.simplefilter('default', DeprecationWarning)
          return func(*args, **kwargs)
      return deprecated_func
  return deprecated_decorator

Puis importez le décorateur de dépréciation comme suit :

from .utils import deprecated

@deprecated("Use method yyy instead")
def some_method()"
 pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X