In Section 7.6.1: Partial application, we saw how a function can be used to modify another function. A decorator is a syntax element in Python that conveniently allows us to alter the behavior of a function without changing the definition of the function itself. Let's start with the following situation.
Assume that we have a function that determines tcitehe degree of sparsity of a matrix:
def how_sparse(A): return len(A.reshape(-1).nonzero()[0])
This function returns an error if it is not called with an array object as input. More precisely, it will not work with an object that does not implement the method reshape. For instance, the function how_sparse will not work with a list, because lists have no method reshape. The following helper function modifies any function with one input parameter so that it tries to make a type conversion to an array:
def cast2array(f): def new_function(obj): fA = f(array(obj)) return fA return...