假设我使用sys._getframe(1)
获得了一个堆栈帧,这显然不是当前帧。
现在我想以某种方式移动到外部堆栈框架并执行一个语句,如x=10
,以便在该框架中创建一个变量。
我理解以这种方式设置变量不是一个好习惯,但它可能只是其他一些声明。因此,重要的部分是如何移动到该框架。 with(frame)
似乎不起作用。
我认为应该可以,否则为什么在getinnerframes
模块中会有两个名为getouterframes
和inspect
的函数?除非你可以移动到外框,为什么你甚至会有内框?
修改:在pdb
模块中,他们有两个命令上下都有docs说
d(自己)将当前帧在堆栈跟踪中向下移动一级(到a 较新的框架)。
u(p)将当前帧向上移动一层 跟踪(到较旧的框架)。
这会对我的情况有所帮助吗?如果是,如何使用它?
答案 0 :(得分: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
,就好像它嵌入嵌套在框架内的类语句中一样范围:
函数文本之外的任何代码都不能创建该函数的局部变量。