获取函数调用者在python信息(Get function callers' informa

2019-06-26 17:49发布

我想大约在python特定函数的调用者的信息。 例如:

class SomeClass():
    def __init__(self, x):
        self.x = x
    def caller(self):
        return special_func(self.x)

def special_func(x):
    print "My caller is the 'caller' function in an 'SomeClass' class."

是否有可能与蟒蛇?

Answer 1:

是的, sys._getframe()功能使用户可以检索当前执行堆栈,然后你就可以用中发现的方法和文件检查帧inspect模块 ; 你会寻找特定的当地人f_locals属性,以及为f_code信息:

import sys
def special_func(x):
    callingframe = sys._getframe(1)
    print 'My caller is the %r function in a %r class' % (
        callingframe.f_code.co_name, 
        callingframe.f_locals['self'].__class__.__name__)

请注意,您需要采取一些护理检测到您在每帧中找到什么样的信息。

sys._getframe()返回一个框对象,就可以通过整个堆叠链通过跟随f_back上的每个参考。 或者你也可以使用inspect.stack()函数来产生帧列表和其他信息。



Answer 2:

一个例子:

def f1(a):
    import inspect
    print 'I am f1 and was called by', inspect.currentframe().f_back.f_code.co_name
    return a

def f2(a):
    return f1(a)

将检索“立竿见影”的来电者。

>>> f2(1)
I am f1 and was called by f2

而如果不是来自另一个叫你(在IDLE):

>>> f1(1)
I am f1 and was called by <module>


Answer 3:

由于乔恩克莱门特回答我是能够使返回所有呼叫者的有序列表的功能:

def f1():
    names = []
    frame = inspect.currentframe()
    ## Keep moving to next outer frame
    while True:
        try:
            frame = frame.f_back
            name = frame.f_code.co_name
            names.append(name)
        except:
            break
    return names

当调用链:

def f2():
    return f1()

def f3():
    return f2()

def f4():
    return f3()

print f4()

看起来是这样的:

['f2', 'f3', 'f4', '<module>']

在我来说,我过滤掉任何在'<module>'后,再取最后一个项目是主叫方的姓名。

或修改原有的循环在开始使用任何名称的第一次亮相保释'<'

frame = frame.f_back
name = frame.f_code.co_name
if name[0] == '<':
    break
names.append(name)


文章来源: Get function callers' information in python