给定inspect.stack()
的输出,是否可以从堆栈帧中的任何地方获取函数对象并调用它们?如果是这样,怎么样?
(我已经知道如何获取函数的名称。)
以下是我的观点:假设我是一个函数,我正在尝试确定我的调用者是生成器还是常规函数?我需要在函数对象上调用inspect.isgeneratorfunction()
。你怎么知道谁给你打电话? inspect.stack()
,对吧?所以如果我能以某种方式把它们放在一起,我会得到我的问题的答案。也许有一种更简单的方法可以做到这一点?
答案 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)