1

假设我使用 获得了一个堆栈帧sys._getframe(1),这显然不是当前帧。

现在我想以某种方式移动到外部堆栈框架并执行一条语句,例如 Maybe x=10,以便在该框架中创建一个变量。

我知道以这种方式设置变量不是一个好习惯,但这可能是其他一些陈述。所以,重要的部分是如何移动到那个框架。with(frame)似乎不起作用。

我认为这应该是可能的,否则为什么会有两个名为getinnerframes和模块getouterframes的函数?inspect除非你可以移到外框,否则为什么还要有内框?

编辑:在pdb模块中,他们有上下两个命令,文档

d(own) 将当前帧在堆栈跟踪中向下移动一级(到较新的帧)。

u(p) 在堆栈跟踪中将当前帧向上移动一级(到较旧的帧)。

这对我的案子有帮助吗?如果是,如何使用?

4

1 回答 1

2

这通常是不可能的。如果框架对应于模块级代码,那么你可以这样做

exec 'x=10' in frame.f_globals, frame.f_locals

在 Python 2 中,或

exec('x=10', frame.f_globals, frame.f_locals)

在 Python 3 中。但是,如果框架对应于函数调用或类主体,那么这将x=10像嵌入在嵌套在框架范围内的类语句中一样执行:

如果将两个单独的对象作为全局变量和局部变量给出,则代码将像嵌入到类定义中一样被执行。

函数文本之外的任何代码都不能创建该函数的局部变量。

于 2015-06-12T04:29:35.463 回答