code: def _is_computed_property(obj, attr_name):
      obj_class = getattr(obj, "__class__", None)
  
      if not obj_class:
          return False
  
      # Go through superclasses in order of inheritance (mro) to see if any of them have an
      # attribute called attr_name. If so, check if it's a @property.
      for parent_class in inspect.getmro(obj_class):
          class_attr = getattr(parent_class, attr_name, None)
  
          if class_attr is None:
              continue
  
          # If is property, return it.
          if isinstance(
              class_attr, property
          ) or inspect.isgetsetdescriptor(class_attr):
              return True
  
      return False
  
imports: import ast
  import contextlib
  import inspect
  import re
  import types
  from typing import TYPE_CHECKING, Any, cast
  from typing_extensions import Final
  import streamlit
  from streamlit.logger import get_logger
  from streamlit.proto.DocString_pb2 import DocString
  from streamlit.proto.DocString_pb2 import Member
  from streamlit.runtime.metrics_util import gather_metrics
  from streamlit.runtime.scriptrunner.script_runner import __file__
  from streamlit.runtime.secrets import Secrets
  from streamlit.string_util import is_mem_address_str
label_desc: Use image node_id 18 for calling a global function with example usage: _is_computed_property(obj, attr_name) and returns: False, False, True