1

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

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

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

4

2 回答 2

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
于 2009-06-23T22:30:56.093 回答
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)
于 2009-06-24T14:43:04.153 回答