您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python eval(compile(…),sandbox),除非在def中,否则全局变量会进入sandbox,为什么?

Python eval(compile(…),sandbox),除非在def中,否则全局变量会进入sandbox,为什么?

在Python中调用函数时,它看到的全局变量始终是其定义所在模块的全局变量。(如果不正确,则该函数可能无法正常工作-实际上可能 需要 一些全局值,并且您不一定要知道它们是什么。)指定带有execeval()仅影响exec‘d或eval()‘d看到的代码全局变量的全局字典。

如果要让函数看到其他全局变量,则确实必须在传递给exec或的字符串中包含函数定义eval()。当您这样做时,函数的“模块”就是从其编译的字符串,带有其自己的全局变量(即,您提供的全局变量)。

您可以通过使用与要调用代码对象相同的代码对象创建一个函数解决此问题func_globals,但是该函数指向您的globals dict却具有不同的属性,但这是相当先进的黑客技术,可能不值得。不过,这是您的处理方式:

# create a sand@R_504_2419@ globals dict
sand@R_504_2419@ = {}

# create a new version of test() that uses the sand@R_504_2419@ for its globals
newtest = type(test)(test.func_code, sand@R_504_2419@, test.func_name, test.func_defaults,
                     test.func_closure)

# add the sand@R_504_2419@ed version of test() to the sand@R_504_2419@
sand@R_504_2419@["test"] = newtest
python 2022/1/1 18:32:15 有561人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶