gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:44:53 35 4
gpt4 key购买 nike

如果我用 Python 评估一些东西:

eval("a + b")

这将使用当前范围(本地和全局)评估表达式。

我正在开发的内容要求“稍后”对表达式求值。这样的话意味着我想保留当前范围(即 locals()globals() )。但我想传递这些值......透明地,或者从上层堆栈框架中获取它们。考虑这个实现(实际上,这个存在):

def __eval(self, expr):
if isinstance(expr, (list, tuple, set, frozenset, dict, Expression)):
return Expression.eval(expr, self)
elif callable(expr):
try:
return expr(self)
except (AttributeError, IndexError, KeyError, TypeError):
return UNDEFINED
else:
try:
return eval(expr, {}, {'self': self})
except (AttributeError, IndexError, KeyError, TypeError):
return UNDEFINED

这个实现解释如下:

  • 如果我使用表达式对象(我实际上开发了这样的对象),那么我使用当前对象计算这样的表达式(毕竟,这个函数是一个方法)。这部分不需要帮助,它已经完全开发了。
  • 如果我使用可调用对象,我会执行可调用对象(例如 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 中使用这些值.

问题:是否有可能得到locals()globals()来自上层堆栈框架?

最佳答案

你真的应该考虑只传入 globals()locals():

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()

如果这不是您的选择,您可以使用 sys._getframe() function 访问父框架,局部变量和全局变量是该框架的属性:

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

关于python - 是否可以从上层堆栈帧获取 locals() 和 globals() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27333707/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com