Python 3.5 如何摆脱类函数中的 eval

标签 python class eval init self

我有一个名为 NumApprox 的类,它接受一个字符串作为输入(包含变量“x”的数学表达式),其中的所有方法只是在给定“x”数值的情况下整合数学表达式的不同方法

预期输入示例:

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

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

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

这就是我所做的,但我不喜欢“eval”函数,并且鉴于我对 Python 类的了解有限......我想知道“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

关于Python 3.5 如何摆脱类函数中的 eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40992077/

相关文章:

c# - 是否可以在 C# 中使用索引来引用类成员变量?

C++ 类访问管理

php - eval() 和 PHP 错误

eval - 在 Fish shell 中通过管道传输 eval/source 的输出

python - 在 Python Visual Studio 下调试时编辑并继续?

python - 来自 csv 的数据透视并存储在数据框中

PHP 类不会返回字符串

c# - 以字符串形式访问对象属性并设置其值

python - 在Python中迭代列表和删除元素时的奇怪行为

python - 在 Pandas 中从 datetime <[M8] 删除时间