gpt4 book ai didi

Python:如何在 eval 中访问 eval 的 globals()

转载 作者:行者123 更新时间:2023-12-01 05:56:09 26 4
gpt4 key购买 nike

标题看起来很蠢,但我不知道如何准确表达,抱歉。

我有一个程序需要评估一些用户代码(通过 RestrictedPython 以确保安全),并且我想将一个函数放入评估的全局变量中,以便它可以在评估时向我打印一些调试信息,例如(简化) :

class UserException(Exception):
pass


def err(msg):
# ? how to get the globals variable in eval ?
A = globals().get('A', 'A not found')
return UserException("%s and A's value is %r" % (msg, A))

g = {
'err': err,
'A': None,
'__builtins__': {},
}

print eval('A or err("A not true")', g)

这将给出结果:

A not true and A's value is 'A not found'

在这里使用“globals()”插入“err”当然是错误的。但我怎样才能得到'err'内'g'的值呢?

最佳答案

从函数内部对 globals() 的任何引用都将始终为您提供定义函数时范围内的全局变量。您在这里看到的内容与将函数从一个模块导入另一个模块时没有什么不同:导入的函数仍然引用定义它的模块的全局变量。

让函数使用 g 作为其 globals() 的最简单方法是使用 g 作为全局变量来执行定义。如果您确实更改了函数的全局变量,那么不要忘记您还需要包含该函数使用的任何其他全局变量;在本例中UserException

或者,您可以让 err() 检查其调用者的堆栈帧并使用调用者的全局变量。这很困惑,但如果是用于调试信息,您可能可以接受。

>>> def err(msg):
# ? how to get the globals variable in eval ?
A = sys._getframe(1).f_globals.get('A', 'A not found')
return UserException("%s and A's value is %r" % (msg, A))

>>> import sys
>>> g = {
'err': err,
'A': None,
'__builtins__': {},
}
>>> print eval('A or err("A not true")', g, g)
A not true and A's value is None
>>>

关于Python:如何在 eval 中访问 eval 的 globals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12527525/

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