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 hasattr(obj, "__call__"):
          return obj.__class__.__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: import collections
  from datetime import datetime, timedelta
  from functools import partial
  import inspect
  import numpy
  from pandas._libs import lib, tslibs
  import pandas.compat
  from pandas.compat import PY36, OrderedDict, iteritems
  from pandas.core.dtypes.cast import construct_1d_object_array_from_listlike
  from pandas.core.dtypes.common import is_array_like, is_bool_dtype, is_extension_array_dtype, is_integer
  from pandas.core.dtypes.generic import ABCIndex, ABCIndexClass, ABCSeries
  from pandas.core.dtypes.inference import _iterable_not_string
  from pandas.core.dtypes.missing import isna, isnull, notnull
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, obj