Suppose I have this code:
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
but I only get this error: NameError: name ‘math’ is not defined
How can I fix this?
Advertisement
Answer
The second parameter to eval
, if present, should reference the global namespace. Here, you explicitely assigned an empty dict to it, so you don’t have any access to the name math
of the global namespace. You could assign d
to the local namespace of eval
instead:
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