数学模块不能在 eval 的字符串中工作

math module not working in a string for eval

假设我有这个代码:

import math
import traceback


def getValue(s,p,val):
    d={}
    for k in range(len(p)):
        d[p[k]]=val[k]

    y = eval(s,d)
    return str(round(y,3))

values = [5,3]
parameters = ['var1','var2']
s = 'var2*3/2 + math.log(100)-var1**2'
x = getValue(s,parameters,values)
 print x

但我只得到这个错误: NameError: 名称 'math' 未定义

我该如何解决这个问题?

最简单的方法是在 eval 调用的 globals 参数中添加 math 符号。

values = [5,3, math]
parameters = ['var1','var2','math']

请注意eval使用任意输入是危险的。

eval 的第二个参数,如果存在,应该引用全局命名空间。在这里,您明确地为其分配了一个空字典,因此您无权访问全局命名空间的名称 math。您可以将 d 分配给 eval 的本地名称空间:

import math
import traceback


def getValue(s,p,val):
    d = {}
    for k in range(len(p)):
        d[p[k]]=val[k]

    y = eval(s, globals(), d)
    return str(round(y,3))

values = [5,3]
parameters = ['var1','var2']
s = 'var2*3/2 + math.log(100)-var1**2'
x = getValue(s,parameters,values)
print(x)
# -15.895