Есть ли альтернатива exec в python?

#python #python-3.x

#python #python-3.x

Вопрос:

Итак, я создаю программу-интегратор с помощью метода simpson 1/3, и я хочу, чтобы пользователь предоставил мне функцию и интервал интеграции, а затем вернул результат. Я полагаю, что могу использовать exec для создания динамического кода, поэтому я использую его для создания функции. Это мой код:

 from math import *

class CreaFormula:
    def __init__(self,formula):
        self.fun = "def f(x):n  return %s" % formula


class Integrador:
    def __init__(self,f):
        #integration interval 
        a = 0
        b = 1
        n = 600 
        h = (b-a)/n
        #method
        self.s = f(a)   f(b)
        for i in range(1,n):
            if i%2 == 0:
                self.s = self.s   2*f(a i*h)
            else:
                self.s = self.s   4*f(a i*h)

        self.s = self.s*(h/3)
        vr = -cos(1)   e
        self.er = abs((vr -self.s) /vr)


formula = input()
MiFo = CreaFormula(formula)
f1 = MiFo.fun
exec(f1)
MyInt = Integrador(f)

a = MyInt.s
b = MyInt.er
print(a)
  

Итак, в принципе, я хочу поместить все, что находится в конце кода, внутрь класса, чтобы я мог вызвать его позже с помощью другого кода, но если я это сделаю, он покажет ошибку, что f не определен, потому что он создается с помощью exec . Итак, есть ли способ не использовать exec, но все же создать функцию из пользовательского ввода?

Заранее спасибо

Комментарии:

1. Я не понимаю назначения строки. Почему бы вам просто не привязать реальную функцию к атрибуту?

2. Проблема с exec в том, что это позволяет пользователю создавать функцию, которая может делать все, что может ваша программа. Если это то, чего вы пытаетесь достичь, то это правильный инструмент для использования. Тем не менее, вы должны понимать последствия этого для безопасности: каким пользователям разрешено использовать эту программу? Нормально ли, что они могут запускать любой код, который они хотят, на этой машине?

3. Возможно, вы также захотите взглянуть на sympy

4. Я бы попробовал ast.parse('formula') , а затем попытался обработать дерево как выражение. Я бы не стал использовать eval или exec, если это не «просто для тестирования» кода для себя.

Ответ №1:

Если вопрос заключается только в том, как создать объект-функцию, который может вычислять предоставленное пользователем выражение, вам, вероятно, будет проще использовать eval , чем exec :

 def create_function_from_formula(formula):
    def user_function(x):
        return eval(formula, globals(), {'x': x})
    return user_function
  

Конечно, даже при eval том, что кто-то предоставляет вредоносный formula файл, он может делать все, вплоть до выполнения любой другой программы, включенной в компьютер. Так что делайте это, только если вы доверяете человеку, предоставляющему formula , по существу, управление вашим компьютером. В частности, вы никогда не должны этого делать, если formula может исходить от пользователя, который еще физически не вошел в систему на вашем компьютере.