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))
我有一个名为 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))