code: def update_wrapper(wrapper,
                     wrapped,
                     assigned = WRAPPER_ASSIGNMENTS,
                     updated = WRAPPER_UPDATES):
      
      for attr in assigned:
          setattr(wrapper, attr, getattr(wrapped, attr))
      for attr in updated:
          getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
      # Return the wrapper so this can be used as a decorator via partial()
      return wrapper
docs: Update a wrapper function to look like the wrapped function
  
         wrapper is the function to be updated
         wrapped is the original function
         assigned is a tuple naming the attributes assigned directly
         from the wrapped function to the wrapper function (defaults to
         functools.WRAPPER_ASSIGNMENTS)
         updated is a tuple naming the attributes of the wrapper that
         are updated with the corresponding attribute from the wrapped
         function (defaults to functools.WRAPPER_UPDATES)