Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以从上层堆栈帧中获取locals()和globals()?_Python - Fatal编程技术网

Python 是否可以从上层堆栈帧中获取locals()和globals()?

Python 是否可以从上层堆栈帧中获取locals()和globals()?,python,Python,如果我在Python中评估某些内容: eval("a + b") 这将使用当前作用域(局部和全局)计算表达式 我正在开发的内容要求“稍后”对表达式求值。这个词意味着我想保留当前范围(即locals()和globals())。但我想传递这样的价值观。。。透明,或从上堆栈帧获取它们。考虑这个实现(实际上,这一个存在): 该实现解释如下: 如果我使用一个表达式对象(我实际开发了这样的对象),那么我会使用当前对象计算这样的表达式(毕竟,这个函数是一个方法)。这一部分不需要帮助,它已经完全开发好了 如

如果我在Python中评估某些内容:

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