Python 3.5 如何去掉 Class 函数中的 eval

Python 3.5 How I can get rid of the eval in my Class function

我有一个名为 NumApprox 的 Class,它以一个字符串作为输入(一个包含变量 'x' 的数学表达式),其中的所有方法只是整合数学表达式的不同方法给定 'x'

的数值

预期输入示例:

  input = " x ** 2 * log( x ) "

  input = "1 / sqrt(2*pi) * exp(- x **2 / 2) "

我想知道如何隔离和控制字符串输入提供的 'x' 变量,并在没有 'eval' 函数的情况下从 class 中的任何地方使用它。

这就是我所做的,但我不喜欢那个 'eval' 函数,鉴于我对 Python Classes 的有限了解...我喜欢想知道是否有比 'eval' 更好的选择?

from math import pi, sqrt, exp, log

class NumApprox:

    def __init__(self, expr):
        self.expr = expr

    def pdf(self, x):
        self.x = x 
        self.ev = eval( self.expr.replace('x', 'self.x') )
        return self.ev

    def integrate_rect_method(self, A, B, n): 
        ...

也许使用模块 SymPy

from sympy import *
from sympy.parsing.sympy_parser import parse_expr

x, y, z = symbols("x y z")

input = " x ** 2 * log( x ) "

#expr = sympify(input) # `sympify` uses `eval`
expr = parse_expr(input)

print(expr)
print(expr.subs({x:2}))

input = "1 / sqrt(2*pi) * exp(- x **2 / 2) "

#expr = sympify(input) # `sympify` uses `eval`
expr = parse_expr(input)

print(expr)
print(expr.subs({x:2}))

结果:

x**2*log(x)
4*log(2)

sqrt(2)*exp(-x**2/2)/(2*sqrt(pi))
sqrt(2)*exp(-2)/(2*sqrt(pi))

Parsing

Basic OperationsSympify