With the python module inspect, one can inspect (not kidding) the
run-time python stack. Among other things, this makes it possible to
get the name of the current function or callers.
Handy for logging or debugging purposes. A simple script to illustrate:
import inspect
# functions
def whoami():
return inspect.stack()[1][3]
def whosdaddy():
return inspect.stack()[2][3]
def foo():
print "hello, I'm %s, daddy is %s" % (whoami(), whosdaddy())
bar()
def bar():
print "hello, I'm %s, daddy is %s" % (whoami(), whosdaddy())
johny = bar
# call them!
foo()
bar()
johny()
output:
hello, I'm foo, daddy is ?
hello, I'm bar, daddy is foo
hello, I'm bar, daddy is ?
hello, I'm bar, daddy is ?
How does it work?
inspect.stack()returns a list with frame records.- In function
whoami():inspect.stack()[1]is the frame record of the function that callswhoami, likefoo()andbar(). - The fourth element of the frame record (
inspect.stack()[1][3]) is the function name.
The rest should be obvious (check the python docs on inspect for more information), except that johny() thinks he's function bar(). That's because johny actually just points to the code of bar() and the function name bar is associated with the code and not with the variables.
Inspiration: