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

2024-09-30 10:33:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经知道函数的名称了

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


Tags: 对象方法函数答案名称stack堆栈常规
2条回答

我采取了以下方法,与厄尔玛的回答非常相似。在

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)

下面是一个代码片段。没有错误检查。其思想是在父函数的局部变量中找到被调用的函数对象。返回的函数对象应该是父对象。如果您还想搜索内置项,那么只需查看堆栈[2][0].f_内置项。在

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解决方案的启发)

^{pr2}$

相关问题 更多 >

    热门问题