functools.update_wrapper in Python
In Python, the update_wrapper is a function of the functools module that updates a wrapper function to look like a wrapped function. In other words, it will update the metadata like __module__, __name__, __doc__ of a wrapper function to look like the wrapped function.
This function can be used with a callable other than the functions. Moreover, any attributes named in assigned or updated that are missing from an object being wrapped will be ignored.
Syntax
The signature for the update_wrapper function is as shown below. Here, WRAPPER_ASSIGNMENTS can be __module__, __name__, __doc__ whereas WRAPPER_UPDATES can be __dict__.
functools.update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
Python update_wrapper Examples:
Example 1: In this case, we are updating the wrappers for documentation and name for the parent function multi.
from functools import partial,update_wrapper
#Multiplication function
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))
mul2.__doc__='''***This function computes the multiplication of two numbers'''
mul2.__name__ = 'product'
print('Documentation of mul2 :', mul2.__doc__)
print('Name of mul2 function is :', mul2.__name__)
update_wrapper(mul2, multi)
print('Documentation of multi :', multi.__doc__)
print('Name of multi is :', multi.__name__)
Output
2*5= 10
Documentation of mul2 : ***This function computes the multiplication of two numbers
Name of mul2 function is : product
Documentation of multi : Computing Multiplication of x and y
Name of multi is : multi
Example 2: In this case, we are first printing the documentation written in code. Thereafter, it gets the documentation of math.pow built-in function.
from functools import partial,update_wrapper
import math
import functools
#partial functions
p2=functools.partial(math.pow,5)
print(p2(2))
p2.__doc__='''computing power of 2 ^ 5'''
p2.__name__ = 'power function'
print('Documentation of p2 :', p2.__doc__)
print('Name of p2 function is :', p2.__name__)
update_wrapper(p2, math.pow)
print('Documentation of math.pow :', math.pow.__doc__)
print('Name of math.pow is :', math.pow.__name__)
Output
25.0
Documentation of p2 : ***This function computes the multiplication of two numbers
Name of p2 function is : product
Documentation of multi : Return x**y (x to the power of y).
Name of multi is : pow
Example 3: In this case, we are updating the wrappers for documentation and name for the parent function simpleint.
from functools import partial,update_wrapper
import math
import functools
#partial functions
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))
si.__doc__='''Computing simple interest'''
si.__name__ = 'SI'
print('Documentation of si :', si.__doc__)
print('Name of si function is :', si.__name__)
update_wrapper(si, simpleint)
print('Documentation of simpleint :', simpleint.__doc__)
print('Name of simpleint is :', simpleint.__name__)
Output
Simple interest is 2100.0
Documentation of si : Computing simple interest
Name of si function is : SI
Documentation of simpleint : ****Computing Simple Interest****
Name of simpleint is : simpleint
Conclusion
Hence, We can use the update_wrapper function to update the wrapper function since Python version 3.2.
References
Happy Learning 🙂