开发者

Get parent function

Is there a way to find what function called the current function? So for exam开发者_JAVA技巧ple:

def first():
    second()

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

Any ideas?


import inspect

def first():
    return second()

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

first()[3] # 'first'


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()


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]


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜