.. _utilipy-why: =================== Benefits of utilipy =================== >>> import utilipy Decorators ========== ``utilipy``-built decorators are better than normal decorators. This decorator **does**: * anything to the function input and output * make a function that looks exactly like the input function for quality introspection. * work when created with parenthesis * accept (kw)arguments on application * add any extra (kw)arguments to control the `wrapper` also make the defaults be dynamically set on function creation. * document what the wrapper is doing. >>> def template_decorator(function=None, *, kw1=None, kw2=None): ... ''''Docstring for decorator. ... ... Description of this decorator ... ... Parameters ... ---------- ... function : types.FunctionType or None, optional ... the function to be decoratored ... if None, then returns decorator to apply. ... kw1, kw2 : any, optional ... key-word only arguments ... sets the wrappeer's default values. ... ... Returns ... ------- ... wrapper : types.FunctionType ... wrapper for function ... does a few things ... includes the original function in a method `.__wrapped__` ... ... ''' ... if function is None: # allowing for optional arguments ... return functools.partial(template_decorator, kw1=k1, kw2=kw2) ... ... @utilipy.wraps(function) ... def wrapper(*args, kw1=kw1, kw2=kw2, kw3='not in decorator factory', **kw): ... """wrapper docstring. ... ... Decorator ... --------- ... prints information about function ... kw1, kw2: defaults {kw1}, {kw2} ... ... """ ... # do stuff here ... return_ = function(*args, **kw) ... # and here ... return return_ ... # /def ... return wrapper ... # /def