我试图用
之类的简短替换我的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)
答案 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