Decorators also support arguments. While adding a decorator we can pass in arguments to it so that we can alter its function. In the example below, we pass in an integer to do_n_times
to indicate how many times we want print_hello
to repeat.
To allow arguments in decorators we need to add another additonal wrapper function which takes in the arguments. The outermost wrapper takes in the decorator arguments, the middle wrapper takes in the function and the innermost layer takes in the function arguments.