#python #math #formula #eval
#python #математика #формула #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
но я получаю только эту ошибку:
Ошибка имени: имя ‘math’ не определено
Как я могу это исправить?
Комментарии:
1. Как вы его запускаете? Если вы делаете это как исполняемый пакетный файл и используете Linux, вам следует добавить shebang для python (или python3)
2. На данный момент я запускаю его в Wing IDE, Windows, и в первой строке у меня есть это: #!/usr/bin/env python
Ответ №1:
Второй параметр eval
, если он присутствует, должен ссылаться на глобальное пространство имен. Здесь вы явно присвоили ему пустой dict , поэтому у вас нет никакого доступа к имени 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
Ответ №2:
Самый простой способ — добавить math
символ к globals
параметру eval
вызова.
values = [5,3, math]
parameters = ['var1','var2','math']
Пожалуйста, имейте в виду, что eval
использование с произвольным вводом опасно.
Комментарии:
1. Что касается опасности eval, я хочу использовать его только для динамических математических формул с динамическими параметрами. Есть ли лучшие решения?
2. Убедитесь, что вы понимаете риски. Это нормально для надежного ввода (например, в утилите только для личного использования). Он не может быть защищен для произвольного ввода. Существует много информации по этой теме, много ее здесь, на SO.