code: def get_callable_name(obj):
      # typical case has name
      if hasattr(obj, "__name__"):
          return getattr(obj, "__name__")
      # some objects don't; could recurse
      if isinstance(obj, partial):
          return get_callable_name(obj.func)
      # fall back to class name
      if callable(obj):
          return type(obj).__name__
      # everything failed (probably because the argument
      # wasn't actually callable); we return None
      # instead of the empty string in this case to allow
      # distinguishing between no name and a name of ''
      return None
  
imports: from __future__ import annotations
  import builtins
  from collections import abc, defaultdict
  from collections.abc import Collection, Generator, Hashable, Iterable, Sequence
  import contextlib
  from functools import partial
  import inspect
  from typing import TYPE_CHECKING, Any, Callable, TypeVar, cast, overload
  import warnings
  import numpy
  from pandas._libs import lib
  from pandas.compat.numpy import np_version_gte1p24
  from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike
  from pandas.core.dtypes.common import is_bool_dtype, is_integer
  from pandas.core.dtypes.generic import ABCExtensionArray, ABCIndex, ABCMultiIndex, ABCSeries
  from pandas.core.dtypes.inference import iterable_not_string
label_desc: Use image node_id 21 for calling a global function with example usage: get_callable_name(obj) and returns: None, getattr, get_callable_name, type