docs: def get_caller_stack_info(start_back: int = 1) -> List[str]:
      r"""
      Retrieves a textual representation of the call stack.
  
      Args:
          start_back: number of calls back in the frame stack (starting
              from the frame stack as seen by :func:`get_caller_stack_info`)
              to begin with
  
      Returns:
          list of descriptions
  
      Example:
  
      .. code-block:: python
  
          from cardinal_pythonlib.debugging import get_caller_stack_info
  
          def who_am_i():
              return get_caller_name()
  
          class MyClass(object):
              def classfunc(self):
                  print("Stack info:\n" + "\n".join(get_caller_stack_info()))
  
          def f2():
              x = MyClass()
              x.classfunc()
  
          def f1():
              f2()
  
          f1()
  
      if called from the Python prompt will produce:
  
      .. code-block:: none
  
          Stack info:
          <module>()
          ... defined at <stdin>:1
          ... line 1 calls next in stack; code is:
  
          f1()
          ... defined at <stdin>:1
          ... line 2 calls next in stack; code is:
  
          f2()
          ... defined at <stdin>:1
          ... line 3 calls next in stack; code is:
  
          classfunc(self=<__main__.MyClass object at 0x7f86a009c6d8>)
          ... defined at <stdin>:2
          ... line 3 calls next in stack; code is:
  
      and if called from a Python file will produce:
  
      .. code-block:: none
  
          Stack info:
          <module>()
          ... defined at /home/rudolf/tmp/stack.py:1
          ... line 17 calls next in stack; code is:
          f1()
  
          f1()
          ... defined at /home/rudolf/tmp/stack.py:14
          ... line 15 calls next in stack; code is:
              f2()
  
          f2()
          ... defined at /home/rudolf/tmp/stack.py:10
          ... line 12 calls next in stack; code is:
              x.classfunc()
  
          classfunc(self=<__main__.MyClass object at 0x7fd7a731f358>)
          ... defined at /home/rudolf/tmp/stack.py:7
          ... line 8 calls next in stack; code is:
                  print("Stack info:\n" + "\n".join(get_caller_stack_info()))
  
      """
      # "0 back" is debug_callers, so "1 back" its caller
      # https://docs.python.org/3/library/inspect.html
      callers = []  # type: List[str]
      frameinfolist = inspect.stack()  # type: List[FrameInfo]  # noqa
      frameinfolist = frameinfolist[start_back:]
      for frameinfo in frameinfolist:
          frame = frameinfo.frame
          function_defined_at = "... defined at {filename}:{line}".format(
              filename=frame.f_code.co_filename,
              line=frame.f_code.co_firstlineno,
          )
          argvalues = inspect.getargvalues(frame)
          formatted_argvalues = inspect.formatargvalues(*argvalues)
          function_call = "{funcname}{argvals}".format(
              funcname=frame.f_code.co_name,
              argvals=formatted_argvalues,
          )
          code_context = frameinfo.code_context
          code = "".join(code_context) if code_context else ""
          onwards = "... line {line} calls next in stack; code is:\n{c}".format(
              line=frame.f_lineno,
              c=code,
          )
          description = "\n".join([function_call, function_defined_at, onwards])
          callers.append(description)
      return list(reversed(callers))