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))
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()))