Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # http://www-01.ibm.com/support/knowledgecenter/SSLVMB_21.0.0/com.ibm.spss.statistics.help/idh_pref_general.htm
- import inspect
- import functools
- import warnings
- warnings.simplefilter("always")
- class check_deprecated_args(object):
- """
- Class decorator that checks whether deprecated parameters with non-default
- arguments are used
- Parameters
- ----------
- deprecated_params : tuple
- tuple of strings of parameters that should raise a DeprecationWarning,
- if they are used with non-default arguments
- methods : tuple, optional
- tuple of strings of method names that include deprecated parameters
- Raises
- ------
- DeprecationWarning : if deprecated parameters are used with
- non-default arguments in the class's constructor.
- """
- def __init__(self, deprecated_params, methods=("__init__",)):
- self.deprecated_params = deprecated_params
- self.methods = methods
- def _used_deprecated(self, used_param, used_arg, default_arg):
- is_deprecated = used_param in self.deprecated_params
- if default_arg != used_arg and is_deprecated:
- return {used_param: used_arg}
- return {}
- def _check_method(self, method, *used_args, **used_kwargs):
- argspec = inspect.getargspec(method)
- default_params = argspec.args[1:]
- default_args = argspec.defaults
- res = {}
- # -- positional args
- for used_param_pos, used_arg in enumerate(used_args):
- used_param = default_params[used_param_pos]
- default_arg = default_args[used_param_pos]
- res.update(self._used_deprecated(used_param, used_arg, default_arg))
- # -- keyword args
- for pos, (used_param, used_arg) in enumerate(used_kwargs.items()):
- default_arg = default_args[pos]
- is_deprecated = used_param in self.deprecated_params
- res.update(self._used_deprecated(used_param, used_arg, default_arg))
- if res:
- deprec = self.deprecated_params
- old = ["%s:%%(%s)s" % (p, p) for p in deprec if p in res]
- old = ", ".join(old) % res
- msg = "you're using obsolete args [%s]" % old
- warnings.warn(msg, DeprecationWarning)
- def __call__(self, cls):
- @functools.wraps(cls)
- def inner(*used_args, **used_kwargs):
- for method in self.methods:
- method = getattr(cls, method)
- self._check_method(method, *used_args, **used_kwargs)
- return getattr(cls, "self")
- return inner
- if __name__ == "__main__":
- @check_deprecated_args(deprecated_params=("old", "older"))
- class Foo(object):
- def __init__(self, old=True, older=None, new="yaay"):
- pass
- def bar(self, old, new):
- return old, new
- f = Foo(new="great", old="obsolete", older="stop using it")
- #print repr(f)
- #f.bar(old="ancient", new="novel")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement