The way I understand decorators of function in python (and I might be wrong), is that they are supposed to add side effects and modify the return value of a function. Now decorators are added above the function definition of the function to be decorated or by an assignment. Here is a small example:
def print_args_decor(function): def wrapper(*args, **kwargs): print Arguments: , args, kwargs # Added side-effect return function(*args, **kwargs)*5 # Modified return value return wrapper @print_args_decor def do_stuff(strg, n=10): """Repeats strg a few times.""" return strg * n new_decorated_func = pirnt_args_decor(do_stuff) # Decoration by assignment print do_stuff( a , 2) # Output: aaaaaaaaaa
Now, how does one attach a decorator to a function defined elsewhere , ideally retaining the original function s name and docstring (like functools.wraps does)? For example, I m importing the sqrt() function from python s mass module, and want to decorate it, how do I go about that?
from functools import wraps from math import sqrt def print_args_decor(function): @wraps(function) def wrapper(*args, **kwargs): print Arguments: , args, kwargs # Added side-effect return function(*args, **kwargs)*5 # Modified return value return wrapper # Decorate the sqrt() function from math module somehow @print_args_decor #??? sqrt #??? print sqrt(9) # Output: # Arguments: ([9],) {} # 15 # <--- sqrt(9)*5
How about decorate methods within classes after the fact? How about decorating classes themselves in the manor?