数学模块不能在 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
假设我有这个代码:
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