Nested functions, how do they work (stack related)
vek.m1234 at gmail.com
Tue Dec 13 02:13:31 EST 2016
I was reading the wiki on 'Call stack' because I wanted to understand
what a traceback object was. My C/C++ isn't good enough to deal with raw
python source since I have no background in CS. Also, you just can't
dive into the python src - it takes a good deal of reading and
background.. (the types will be confusing for a start)
'Programming languages that support nested subroutines also have a field
in the call frame that points to the stack frame of the latest
activation of the procedure that most closely encapsulates the callee,
i.e. the immediate scope of the callee. This is called an access link or
static link (as it keeps track of static nesting during dynamic and
recursive calls) and provides the routine (as well as any other routines
it may invoke) access to the local data of its encapsulating routines at
every nesting level.
Some architectures, compilers, or optimization cases store one link for
each enclosing level (not just the immediately enclosing), so that
deeply nested routines that access shallow data do not have to traverse
several links; this strategy is often called a "display".'
1. What is the difference between a 'call frame' and a 'stack frame' in
the above context? I know that a stack frame is all the data related to
one - CALL foo;
2. He's saying that within the 'call frame' (whatever that is) there's
an address to one of the previous stack frames of the wrapper function ?
What does all that mean in terms of nested functions? Access link? How
are nested function stacks setup..
3. What exactly is a traceback object - we know that an instance object
is a dictionary and some glue logic that allows you to pretend that
methods are stored within the instance and call using x.sin(self) etc.
But I was reading: pydoc traceback AND:
'Extract the raw traceback from the current stack frame'
A stack frame contains (from wiki) the parameters, local variables, next
instruction address so.. what's a raw traceback - does the default
exception handler realize 'okay error' and then walk the stack and
extract data and prettify it for display and build a magical traceback
object? Is this documented for dummies what exactly it does?
(i know that's what it's doing but I HAVE NO CLUE so.. are there books
How exactly does an exception fit in with tracebacks? How does all this
fit in with nested functions?
4. When you call a nested function (decorator), it generally returns a
wrapper function but I thought he was just returning a reference to a
function object but obviously since it can see it's environment, how is
the stack being setup?
More information about the Python-list