docs: def get_caller_name(back: int = 0) -> str:
      """
      Return details about the CALLER OF THE CALLER (plus n calls further back)
      of this function.
  
      So, if your function calls :func:`get_caller_name`, it will return the
      name of the function that called your function! (Or ``back`` calls further
      back.)
  
      Example:
  
      .. code-block:: python
  
          from cardinal_pythonlib.debugging import get_caller_name
  
          def who_am_i():
              return get_caller_name()
  
          class MyClass(object):
              def classfunc(self):
                  print("I am: " + who_am_i())
                  print("I was called by: " + get_caller_name())
                  print("That was called by: " + get_caller_name(back=1))
  
          def f2():
              x = MyClass()
              x.classfunc()
  
          def f1():
              f2()
  
          f1()
  
      will produce:
  
      .. code-block:: none
  
          I am: MyClass.classfunc
          I was called by: f2
          That was called by: f1
  
      """
      # http://stackoverflow.com/questions/5067604/determine-function-name-from-within-that-function-without-using-traceback  # noqa
      try:
          # noinspection PyProtectedMember
          frame = sys._getframe(back + 2)
      except ValueError:
          # Stack isn't deep enough.
          return '?'
      function_name = frame.f_code.co_name
      class_name = get_class_name_from_frame(frame)
      if class_name:
          return "{}.{}".format(class_name, function_name)
      return function_name