code: def update_wrapper(
      wrapper,
      wrapped,
      assigned=WRAPPER_ASSIGNMENTS,
      updated=WRAPPER_UPDATES,
  ):
      """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)
      """
      for attr in assigned:
          try:
              value = getattr(wrapped, attr)
          except AttributeError:
              pass
          else:
              setattr(wrapper, attr, value)
      for attr in updated:
          getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
      # Issue #17482: set __wrapped__ last so we don't inadvertently copy it
      # from the wrapped function when updating __dict__
      wrapper.__wrapped__ = wrapped
      # Return the wrapper so this can be used as a decorator via partial()
      return wrapper
  
imports: from abc import get_cache_token
  from collections import namedtuple
  from reprlib import recursive_repr
  from _thread import RLock
  from types import GenericAlias
label_desc: Use image node_id 1 for calling a global function with example usage: update_wrapper(wrapper, wrapped, assigned, updated) and returns: wrapper