给定 的输出inspect.stack()
,是否可以从堆栈帧的任何位置获取函数对象并调用它们?如果是这样,怎么做?
(我已经知道如何获取函数的名称。)
这就是我的意思:假设我是一个函数,并且我正在尝试确定我的调用者是生成器还是常规函数?我需要调用inspect.isgeneratorfunction()
函数对象。你怎么知道是谁给你打电话的?inspect.stack()
, 对?因此,如果我能以某种方式将它们放在一起,我就会得到我的问题的答案。也许有更简单的方法可以做到这一点?
给定 的输出inspect.stack()
,是否可以从堆栈帧的任何位置获取函数对象并调用它们?如果是这样,怎么做?
(我已经知道如何获取函数的名称。)
这就是我的意思:假设我是一个函数,并且我正在尝试确定我的调用者是生成器还是常规函数?我需要调用inspect.isgeneratorfunction()
函数对象。你怎么知道是谁给你打电话的?inspect.stack()
, 对?因此,如果我能以某种方式将它们放在一起,我就会得到我的问题的答案。也许有更简单的方法可以做到这一点?
这是一个代码片段。没有错误检查。这个想法是在祖父母的本地人中找到被调用的函数对象。返回的函数对象应该是父对象。如果您还想搜索内置函数,只需查看 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
我采用了以下方法,与 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)