An alternative to functools.wraps which also preserves the original function’s call signature by way of make_function_with_signature.
The documentation for the original functools.wraps follows:
Decorator factory to apply update_wrapper() to a wrapper function
Returns a decorator that invokes update_wrapper() with the decorated function as the wrapper argument and the arguments to wraps() as the remaining arguments. Default arguments are as for update_wrapper(). This is a convenience function to simplify applying partial() to update_wrapper().