如何不使用全局作用域向exec传值并从中获取变量值
解决方案
Python 的 exec 内置函数原生支持传入两个自定义字典参数,分别作为代码执行时的全局作用域和局部作用域,通过这两个参数就能完全控制 exec 可访问的所有变量,彻底隔离外部全局作用域。
实现代码
a = 100 b = 200 snip = ''' c = a+b ''' # 自定义作用域字典,提前传入需要暴露给exec的变量 exec_scope = { 'a': a, 'b': b } # 将自定义字典同时作为全局、局部作用域传入,完全隔离外部环境 exec(snip, exec_scope, exec_scope) # 从自定义字典中读取exec执行后生成的变量 c = exec_scope['c'] print(c)
核心说明
- 不需要传入当前环境的
globals()或locals(),所有允许exec访问的变量都提前写入自定义字典即可,exec 无法读取外部全局作用域的其他变量,不会造成变量污染。 - exec 执行过程中新增、修改的所有变量都会同步到传入的自定义字典中,执行结束后直接从字典取值即可获取执行结果。
- 如果需要进一步限制
exec的执行权限,可以自定义内置方法暴露范围,比如仅允许使用指定内置函数:
# 限制exec只能调用int、str两个内置方法,完全屏蔽其他内置能力 safe_exec_scope = { '__builtins__': {'int': int, 'str': str}, 'a': 100, 'b': 200 } exec('c = a + b', safe_exec_scope, safe_exec_scope) print(safe_exec_scope['c'])
内容的提问来源于stack exchange,提问作者Daniel Warfield
相关产品推荐
相关产品推荐

