#!/usr/bin/env python """ Deprecated decorator. Author: Giampaolo Rodola' <g.rodola [AT] gmail [DOT] com> License: MIT """ import warnings def deprecated(replacement=None): """A decorator which can be used to mark functions as deprecated. replacement is a callable that will be called with the same args as the decorated function. >>> @deprecated() ... def foo(x): ... return x ... >>> ret = foo(1) DeprecationWarning: foo is deprecated >>> ret 1 >>> >>> >>> def newfun(x): ... return 0 ... >>> @deprecated(newfun) ... def foo(x): ... return x ... >>> ret = foo(1) DeprecationWarning: foo is deprecated; use newfun instead >>> ret 0 >>> """ def outer(oldfun): def inner(*args, **kwargs): msg = "%s is deprecated" % oldfun.__name__ if replacement is not None: msg += "; use %s instead" % (replacement.__name__) warnings.warn(msg, DeprecationWarning, stacklevel=2) if replacement is not None: return replacement(*args, **kwargs) else: return oldfun(*args, **kwargs) return inner return outer if __name__ == '__main__': def sum_many(*args): return sum(args) @deprecated(sum_many) def sum_couple(a, b): return a + b print sum_couple(2, 2)