【问题标题】:How to move up and down between stack frames?如何在堆栈帧之间上下移动?
【发布时间】:2015-11-11 01:40:59
【问题描述】:

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

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

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

我觉得应该是可以的,不然为什么inspect模块里会有getinnerframesgetouterframes这两个函数呢?除非你可以移到外框,否则为什么还要有内框?

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

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

u(p) 将当前帧在堆栈中上移一级 跟踪(到旧框架)。

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

【问题讨论】:

标签: python cpython stack-frame


【解决方案1】:

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

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,就好像它嵌入在框架范围内嵌套的类语句中一样:

If two separate objects are given as globals and locals, the code will be executed as if it were embedded in a class definition.

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

【讨论】:

  • 好吧,如果那是真的,那么在inspect 中有getinnerframes 函数背后的解释是什么?它实际上应该返回什么?
  • @bendtherules:所有返回或访问帧的东西主要是检查它们的数据,而不是修改它。
  • 是的,但是那个函数甚至返回什么?
  • @bendtherules:它返回它所说的返回 - 回溯帧和所有内部帧的帧记录列表,直到引发异常的位置。回溯的框架似乎是捕获异常的框架。 “帧记录”在前面已定义。如果你有更多问题,你应该点击按钮而不是把它们放在另一个问题的 cmets 中。无论如何,我真的不明白为什么你认为这个问题是相关的; getinnerframes 的用处并不取决于能够以某种方式在返回的帧中执行语句。
猜你喜欢
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2012-12-27
  • 2015-05-20
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2015-01-06
相关资源
最近更新 更多