Python 是否可以从上层堆栈帧中获取locals()和globals()?
如果我在Python中评估某些内容:Python 是否可以从上层堆栈帧中获取locals()和globals()?,python,Python,如果我在Python中评估某些内容: eval("a + b") 这将使用当前作用域(局部和全局)计算表达式 我正在开发的内容要求“稍后”对表达式求值。这个词意味着我想保留当前范围(即locals()和globals())。但我想传递这样的价值观。。。透明,或从上堆栈帧获取它们。考虑这个实现(实际上,这一个存在): 该实现解释如下: 如果我使用一个表达式对象(我实际开发了这样的对象),那么我会使用当前对象计算这样的表达式(毕竟,这个函数是一个方法)。这一部分不需要帮助,它已经完全开发好了 如
eval("a + b")
这将使用当前作用域(局部和全局)计算表达式
我正在开发的内容要求“稍后”对表达式求值。这个词意味着我想保留当前范围(即locals()
和globals()
)。但我想传递这样的价值观。。。透明,或从上堆栈帧获取它们。考虑这个实现(实际上,这一个存在):
该实现解释如下:
- 如果我使用一个表达式对象(我实际开发了这样的对象),那么我会使用当前对象计算这样的表达式(毕竟,这个函数是一个方法)。这一部分不需要帮助,它已经完全开发好了
- 如果使用callable,则执行callable(例如lambda表达式)
- 如果我使用字符串,那将是一个python表达式,我希望使用调用时间
和locals()
执行这种计算globals()
o._O__eval("self.a + self.b", globals(), locals())
#THIS WOULD REQUIRE to alter the method to allow two additional dict parameters
#NO, I will not call this function directly, but lets follow the example
但是我希望在用户不显式传递的情况下获得这样的globals()
和locals
,并在eval
中使用这样的值
< > >强>问题> /强>:是否有可能从上堆栈帧获得<代码> >(代码)>和<代码> GULALSL()/代码>? 如果这不是您的选项,则可以使用访问父帧,并且局部和全局是该帧上的属性:
def __eval(self, expr, eval_globals=None, eval_locals=None):
call_frame = sys._getframe(1)
eval_globals, eval_locals = call_frame.f_globals, call_frame.f_locals
在这个设计中,要考虑“如果每个人都想做同样的事情,你是什么?”问题。也就是说,假设你得到了你想要的,然后我想写另一个方便的函数来调用你的
\uu eval
。我该怎么告诉它,“不,不是这个堆栈框架,继续往上爬”?如果你敢调用scope['$eval'](“a+b”)
,这是调用u eval的实际方式(是的,它有点像Python的AngularJS端口,但只是部分),那么你将使用调用时间的词法范围(这样的词法作用域有一个额外的处理,让“self”指向当前的$scope对象)。它现在可以工作:)。然而,尽管我要求使用这个奇怪的用例,但它不是最需要的用例$eval总是在$watch调用中调用(毕竟,它部分是一个AngularJS$rootScope端口)。
def __eval(self, expr, eval_globals=None, eval_locals=None):
if eval_globals is None:
eval_globals = globals()
if eval_locals is None:
eval_locals = eval_globals()
def __eval(self, expr, eval_globals=None, eval_locals=None):
call_frame = sys._getframe(1)
eval_globals, eval_locals = call_frame.f_globals, call_frame.f_locals