从周围的框架中获取本地人()

时间:2014-03-11 21:02:37

标签: python python-decorators

我试图用

之类的简短替换我的Template(s).substitute("$a,$b", locals())
sub("$a,$b")

但是,我无法访问sub()内的周围范围内的本地人,知道如何获取它们吗? 我找到的一个可能的解决方法是抛出一个异常,抓住它,然后沿着框架逐步找到前一帧,但也许有更简单的方法吗?

import traceback, sys, code
try:
  2/0
except Exception as e:
  type, value, tb = sys.exc_info()
  traceback.print_exc()
  last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb
  frame = last_frame().tb_frame
  ns = dict(frame.f_globals)

2 个答案:

答案 0 :(得分:2)

尝试使用sys._current_frames()而非提出异常。

可能的替代方案:sys._getframe()inspect.currentframe()inspect.stack()

我无法想到比分析帧更好的解决方案。

答案 1 :(得分:1)

您可以通过sys._getframe()直接访问它,但它只能保证与CPython一起使用。

from string import Template
import sys

def sub(template):
    namespace = sys._getframe(1).f_locals  # caller's locals
    return Template(template).substitute(namespace)

a, b = 1, 42
print sub("$a,$b")  # -> 1,42