Determining the Name of the Current Function
Credit: Alex Martelli
Problem
You have error messages that include the name of the function emitting them. To copy such messages to other functions, you have to edit them each time, unless you can automatically find the name of the current function.
Solution
This introspective task is easily performed with
sys._getframe.
This function returns a frame object whose attribute
f_code is a code object and the
co_name attribute of that object is the function
name:
import sys this_function_name = sys._getframe( ).f_code.co_name
The frame and code objects also offer other useful information:
this_line_number = sys._getframe( ).f_lineno this_filename = sys._getframe( ).f_code.co_filename
By calling sys._getframe(1), you can get this
information for the caller of the current function. So you can
package this functionality into your own handy functions:
def whoami( ):
import sys
return sys._getframe(1).f_code.co_name
me = whoami( )This calls sys._getframe with argument 1, because
the call to whoami is now frame 0. Similarly:
def callersname( ):
import sys
return sys._getframe(2).f_code.co_name
him = callersname( )Discussion
You want to determine the name of the currently running
function—for example, to create error messages that
don’t need to be changed when copied to other
functions. The function _getframe function of the
sys module does this and much more. This recipe is
inspired by Recipe 10.4 in the Perl Cookbook.
Python’s sys._getframe, new in 2.1, ...