从框架对象获取执行堆栈上的函数对象的引用?

时间:2009-06-23 19:34:07

标签: python inspect stackframe

给定inspect.stack()的输出,是否可以从堆栈帧中的任何地方获取函数对象并调用它们?如果是这样,怎么样?

(我已经知道如何获取函数的名称。)

以下是我的观点:假设我是一个函数,我正在尝试确定我的调用者是生成器还是常规函数?我需要在函数对象上调用inspect.isgeneratorfunction()。你怎么知道谁给你打电话? inspect.stack(),对吧?所以如果我能以某种方式把它们放在一起,我会得到我的问题的答案。也许有一种更简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:2)

这是执行此操作的代码段。没有错误检查。我们的想法是在祖父的本地中找到被调用的函数对象。返回的函数对象应该是父对象。如果你还要搜索内置函数,那么只需查看stacks [2] [0] .f_builtins。

def f():
    stacks  = inspect.stack()
    grand_parent_locals = stacks[2][0].f_locals
    caller_name = stacks[1][3]
    candidate = grand_parent_locals[caller_name]

对于课程,可以编写以下内容(受Marcin解决方案启发)

class test(object):
    def f(self):
        stack = inspect.stack()
        parent_func_name = stack[1][3]
        parent_func = getattr(self, parent_func_name).im_func

答案 1 :(得分:0)

我采用了以下方法,与Eolmar的答案非常相似。

stack = inspect.stack()
parent_locals = stack[1][0].f_locals['self']
parent_func_name = stack[1][3]
parent_func_attr = getattr(parent_locals,parent_func_name)
parent_func = parent_func_attr.im_func
is_parent_gen = inspect.isgeneratorfunction(func)