""" A decorator for marking methods/functions as deprecated. """


# Standard library imports.
import logging

# We only warn about each function or method once!
_cache = {}


def deprecated(message):
    """ A factory for decorators for marking methods/functions as deprecated.

    """

    def decorator(fn):
        """ A decorator for marking methods/functions as deprecated. """

        def wrapper(*args, **kw):
            """ The method/function wrapper. """

            global _cache

            module_name = fn.__module__
            function_name = fn.__name__

            if (module_name, function_name) not in _cache:
                logging.getLogger(module_name).warning(
                    'DEPRECATED: %s.%s, %s' % (
                        module_name, function_name, message
                    )
                )

                _cache[(module_name, function_name)] = True

            return fn(*args, **kw)

        wrapper.__doc__  = fn.__doc__
        wrapper.__name__ = fn.__name__

        return wrapper

    return decorator

#### EOF ######################################################################


""" A decorator for marking methods/functions as deprecated. """

# Standard library imports.
import functools
import warnings


def deprecated(message):
    """ A factory for decorators for marking methods/functions as deprecated.

    """
    def decorator(fn):
        """ A decorator for marking methods/functions as deprecated. """

        @functools.wraps(fn)
        def wrapper(*args, **kw):
            """ The method/function wrapper. """

            warnings.warn(message, DeprecationWarning, stacklevel=2)
            return fn(*args, **kw)

        return wrapper

    return decorator

Simplify deprecation machinery: don't cache previous messages, and use warnings instead of logging.
Simplify deprecation machinery: don't cache previous messages, and use warnings instead of logging.

+ 
  """ A decorator for marking methods/functions as deprecated. """
  
- 
  # Standard library imports.
+ import functools
+ import warnings
- import logging
- 
- # We only warn about each function or method once!
- _cache = {}
  
  
  def deprecated(message):
      """ A factory for decorators for marking methods/functions as deprecated.
  
      """
- 
      def decorator(fn):
          """ A decorator for marking methods/functions as deprecated. """
  
+         @functools.wraps(fn)
          def wrapper(*args, **kw):
              """ The method/function wrapper. """
  
+             warnings.warn(message, DeprecationWarning, stacklevel=2)
-             global _cache
- 
-             module_name = fn.__module__
-             function_name = fn.__name__
- 
-             if (module_name, function_name) not in _cache:
-                 logging.getLogger(module_name).warning(
-                     'DEPRECATED: %s.%s, %s' % (
-                         module_name, function_name, message
-                     )
-                 )
- 
-                 _cache[(module_name, function_name)] = True
- 
              return fn(*args, **kw)
- 
-         wrapper.__doc__  = fn.__doc__
-         wrapper.__name__ = fn.__name__
  
          return wrapper
  
      return decorator
  
- #### EOF ######################################################################
- 
Simplify deprecation machinery: don't cache previous messages, and use warnings instead of logging.
## Code Before:
""" A decorator for marking methods/functions as deprecated. """


# Standard library imports.
import logging

# We only warn about each function or method once!
_cache = {}


def deprecated(message):
    """ A factory for decorators for marking methods/functions as deprecated.

    """

    def decorator(fn):
        """ A decorator for marking methods/functions as deprecated. """

        def wrapper(*args, **kw):
            """ The method/function wrapper. """

            global _cache

            module_name = fn.__module__
            function_name = fn.__name__

            if (module_name, function_name) not in _cache:
                logging.getLogger(module_name).warning(
                    'DEPRECATED: %s.%s, %s' % (
                        module_name, function_name, message
                    )
                )

                _cache[(module_name, function_name)] = True

            return fn(*args, **kw)

        wrapper.__doc__  = fn.__doc__
        wrapper.__name__ = fn.__name__

        return wrapper

    return decorator

#### EOF ######################################################################

## Instruction:
Simplify deprecation machinery: don't cache previous messages, and use warnings instead of logging.
## Code After:

""" A decorator for marking methods/functions as deprecated. """

# Standard library imports.
import functools
import warnings


def deprecated(message):
    """ A factory for decorators for marking methods/functions as deprecated.

    """
    def decorator(fn):
        """ A decorator for marking methods/functions as deprecated. """

        @functools.wraps(fn)
        def wrapper(*args, **kw):
            """ The method/function wrapper. """

            warnings.warn(message, DeprecationWarning, stacklevel=2)
            return fn(*args, **kw)

        return wrapper

    return decorator
