математический модуль не работает в строке для eval

#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.