#!/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__':
# --- new function
def sum_many(*args):
return sum(args)
# --- old / deprecated function
@deprecated(sum_many)
def sum_couple(a, b):
return a + b
print sum_couple(2, 2)
Diff to Previous Revision
--- revision 1 2011-08-02 19:37:04
+++ revision 2 2011-12-03 09:52:08
@@ -53,9 +53,11 @@
if __name__ == '__main__':
+ # --- new function
def sum_many(*args):
return sum(args)
+ # --- old / deprecated function
@deprecated(sum_many)
def sum_couple(a, b):
return a + b