@functools.wraps in Python
In Python, the wraps is a decorator of the functools module. It will be used as a convenience function for invoking the update_wrapper as a function decorator when defining a wrapper function. Therefore, it is equivalent to the partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated).
So, this also updates the metadata like __module__
, __name__
, __doc__
of a wrapper function to look like the wrapped function.
Syntax
The signature for the wraps decorator is as shown below. Here, WRAPPER_ASSIGNMENTS
can be __module__
, __name__
, __doc__
whereas WRAPPER_UPDATES
can be __dict__
.
@wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
Python @wraps Examples:
Example 1: In this case, we display the list of the arguments and keywords of the multi-function even before a function call.
from functools import partial,wraps
def show_args(f):
@wraps(f)
def wrapper(*args, **kwargs):
print("Calling function ",f.__name__," with the arguments",args,"and keywords ", kwargs)
return f(*args, **kwargs)
return wrapper
#Multiplication function
@show_args
def multi(x,y):
'''Computing Multiplication of x and y'''
return x*y
#partial functions
mul2 = partial(multi, y=2)
print("2*5= ",mul2(5))
Output
Calling function multi with the arguments (5,) and keywords {'y': 2}
2*5= 10
Example 2: In this case, we display the list of the arguments and keywords of the power2 function even before a function call.
from functools import partial,wraps
import math
def show_args(f):
@wraps(f)
def wrapper(*args, **kwargs):
print("Calling function ",f.__name__," with the arguments",args,"and keywords ", kwargs)
return f(*args, **kwargs)
return wrapper
#partial functions
@show_args
def power2(n,m):
'''****Computing n raised to m****'''
return (math.pow(n,m))
si = partial(power2,2)
print("Computing 2 raised to 5 result is ",si(5))
Output
Calling function power2 with the arguments (2, 5) and keywords {}
Computing 2 raised to 5 result is 32.0
Example 3: In this case, we are displaying the list of the arguments and keywords of the simple int function even before a function call.
from functools import partial,wraps
def show_args(f):
@wraps(f)
def wrapper(*args, **kwargs):
print("Calling function ",f.__name__," with the arguments",args,"and keywords ", kwargs)
return f(*args, **kwargs)
return wrapper
#partial functions
@show_args
def simpleint(p,r,t):
'''****Computing Simple Interest****'''
return (p*r*t)/100.0
si = partial(simpleint,7,t=3)
print("Simple interest is ",si(10000))
Output
Calling function simpleint with the arguments (7, 10000) and keywords {'t': 3}
Simple interest is 2100.0
Conclusion
Hence, We can use the wraps decorator as a convenience function to help the update_wrapper.
References
Happy Learning 🙂