Credit: Alex Martelli
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.
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( )
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, offers information equivalent to (but richer than)
Perl’s built-in caller
,
_ _LINE_ _
, and _ _FILE_ _
. If
you need this functionality for older Python releases, see
Recipe 14.9.
Recipe 14.9 for a version that works with
older Python versions; documentation on the
_getframe
method of the sys
module in the Library Reference; Perl Cookbook Recipe 10.4.
Get Python Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.