我有一个要在 python 程序中执行的字符串,我想将字符串中的一些变量(如 x[1]、x[2])更改为其他变量。
我之前使用过带有 2 个参数的 eval (第二个是带有 Replaced_word: new_word 的字典),但现在我注意到我不能像这样使用以前导入的模块。所以如果我这样做
from math import log
eval(log(x[1], {x[1]: 1})
它会说它无法识别名称日志。
如何在不丢失全局变量的情况下使用 eval ?
我真的无法理解文档:https://docs.python.org/2/library/functions.html#eval https://docs.python.org/2/library/functions.html#eval所以解释也很有用。
构建您的全局变量dict
with globals() https://docs.python.org/2/library/functions.html#globals作为基础:
from math import log
# Copy the globals() dict so changes don't affect real globals
eval_globals = globals().copy()
# Tweak the copy to add desired new global
eval_globals[x[1]] = 1
# eval using the updated copy
eval('log(x[1])', eval_globals)
或者,您可以使用三参数eval https://docs.python.org/2/library/functions.html#eval to use globals()
未修改,但也提供local
s dict
将首先检查(和修改),优先于全局值:
eval('log(x[1])', globals(), {x[1]: 1})
理论上,后一种方法可以允许表达式改变原始全局变量,因此添加.copy()
做到这一点eval('log(x[1])', globals().copy(), {x[1]: 1})
最大限度地减少意外发生的风险。但病态/恶意代码可以解决这个问题;eval
毕竟是危险的,无论你如何将其沙箱化,都不要相信它可以进行任意输入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)