Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get parent function

Tags:

python

Is there a way to find what function called the current function? So for example:

def first():
    second()

def second():
    # print out here what function called this one

Any ideas?

like image 862
astrofrog Avatar asked Mar 27 '10 15:03

astrofrog


4 Answers

import inspect

def first():
    return second()

def second():
    return inspect.getouterframes( inspect.currentframe() )[1]

first()[3] # 'first'
like image 97
poke Avatar answered Nov 17 '22 22:11

poke


These work well for quickly adding minimal where-am-I debugging aids when you don't want to import yet another module. (CPython only, for debugging only.)

def LINE( back = 0 ):
    return sys._getframe( back + 1 ).f_lineno
def FILE( back = 0 ):
    return sys._getframe( back + 1 ).f_code.co_filename
def FUNC( back = 0):
    return sys._getframe( back + 1 ).f_code.co_name
def WHERE( back = 0 ):
    frame = sys._getframe( back + 1 )
    return "%s/%s %s()" % ( os.path.basename( frame.f_code.co_filename ),
                            frame.f_lineno, frame.f_code.co_name )

Example:

import sys, os # these you almost always have...

def WHERE( back = 0 ):
    frame = sys._getframe( back + 1 )
    return "%s/%s %s()" % ( os.path.basename( frame.f_code.co_filename ),
                        frame.f_lineno, frame.f_code.co_name )

def first():
    second()

def second():
    print WHERE()
    print WHERE(1)

first()

Output:

$ python fs.py
fs.py/12 second()
fs.py/9 first()
like image 41
Kevin Little Avatar answered Nov 17 '22 20:11

Kevin Little


You can use the traceback module's extract_stack function.

import traceback
def first():
    second()

def second():
    print traceback.extract_stack(limit=2)[-2][2]
like image 2
Daniel Stutzbach Avatar answered Nov 17 '22 22:11

Daniel Stutzbach


The inspect module allows for many forms of introspection including this one, but note that it's only recommended to use such information for purposes such as debugging, not as part of your production code's functionality. See the docs for all details.

like image 2
Alex Martelli Avatar answered Nov 17 '22 20:11

Alex Martelli