import warnings import functools __all__ = ['deprecated'] class deprecated(object): '''Decorator to mark deprecated functions with warning. Adapted from . Parameters ---------- alt_func : str If given, tell user what function to use instead. behavior : {'warn', 'raise'} Behavior during call to deprecated function: 'warn' = warn user that function is deprecated; 'raise' = raise error. ''' def __init__(self, alt_func=None, behavior='warn'): self.alt_func = alt_func self.behavior = behavior def __call__(self, func): msg = 'Call to deprecated function `%s`.' % func.__name__ if self.alt_func is not None: msg += ' Use `%s` instead.' % self.alt_func @functools.wraps(func) def wrapped(*args, **kwargs): if self.behavior == 'warn': warnings.warn_explicit(msg, category=DeprecationWarning, filename=func.func_code.co_filename, lineno=func.func_code.co_firstlineno + 1) elif self.behavior == 'raise': raise DeprecationWarning(msg) return func(*args, **kwargs) # modify doc string to display deprecation warning doc = 'Deprecated function.' if self.alt_func is not None: doc += ' Use `%s` instead.' % self.alt_func if wrapped.__doc__ is None: wrapped.__doc__ = doc else: wrapped.__doc__ = doc + '\n\n' + wrapped.__doc__ return wrapped