Wrapping any function: *args, **kwargs and functools.wraps

Real decorators must work with any signature. The Unpacking series showed how *args and **kwargs collect arbitrary arguments. This lesson plugs them into a wrapper, then uses functools.wraps to keep the original function's name.