code: def updateable(fn):
      @wraps(fn)
      def wrapper(*args, **kwargs):
          fn_args = inspect.getfullargspec(fn).args
          self = args[0]
  
          # We need to ensure __init__ is always called at least once
          # so that the component has all the variables in self defined
          # test_blocks.py::test_async_iterator_update_with_new_component
          # checks this
          initialized_before = hasattr(self, "_constructor_args")
          if not initialized_before:
              self._constructor_args = []
          for i, arg in enumerate(args):
              if i == 0 or i >= len(fn_args):  #  skip self, *args
                  continue
              arg_name = fn_args[i]
              kwargs[arg_name] = arg
          self._constructor_args.append(kwargs)
          if in_event_listener() and initialized_before:
              return None
          else:
              return fn(self, **kwargs)
  
      return wrapper
  
file_path: gradio/gradio/component_meta.py
imports: from __future__ import annotations
  import ast
  import inspect
  from abc import ABCMeta
  from functools import wraps
  from pathlib import Path
  from jinja2 import Template
  from gradio.events import EventListener
  from gradio.exceptions import ComponentDefinitionError
  from gradio.utils import no_raise_exception
label_desc: Use image node_id 5 for calling a global function with example usage: updateable(fn) and returns: wrapper, None, fn