2010-03-27 64 views
8

有没有办法找到称为当前功能的函数?例如:获取父功能

def first(): 
    second() 

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

任何想法?

+4

@MikeG .:婉婷此信息在生产释放是坏的,是的。使用它来调试和理解一大块Python是好的,恕我直言。 – 2010-03-27 19:18:19

回答

7
import inspect 

def first(): 
    return second() 

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

first()[3] # 'first' 
2

您可以使用回溯模块的extract_stack函数。

import traceback 
def first(): 
    second() 

def second(): 
    print traceback.extract_stack(limit=2)[-2][2] 
2

inspect模块允许内省的多种形式,包括这一个,但请注意,这只是建议使用用途,如调试等信息,不作为你的产品代码的功能的一部分。所有细节见the docs

1

这些对于在不想导入另一个模块时快速添加最少的调试帮助很有效。 (仅CPython的,仅用于调试。)

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) 

实施例:

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

输出:

$ python fs.py 
fs.py/12 second() 
fs.py/9 first()