我想构建一个类,它能够在运行时获取一些用户定义的表达式,并根据它们和类拥有的一些预定义变量进行计算,例如:用户将知道变量a,b,c& d存在:
伪代码:
>>> foo = myclass()
>>> foo.a = 2
>>> foo.b = 3
>>> foo.expression = 'a + b'
>>> foo.run_expression()
5
>>> foo.expression = 'a * b'
>>> foo.run_expression()
10
我已经探索过lambda函数,但是他们似乎需要我每次创建一个新函数时明确定义lambda函数的输入是什么意思,这意味着他们希望从用户那里获得大量的锅炉板输入更新lambda,因为我知道输入总是一组预定义的变量。
有没有人有过做类似事情的经验,或者对如何构建这样的程序有任何想法?
答案 0 :(得分:2)
要将表达式计算为Python,请使用eval()
function,将vars(self)
作为命名空间传递:
def run_expression(self):
return eval(self.expression, vars(self))
知道这会让你了解攻击向量,恶意用户可以执行任意代码并更改程序以执行完全不同的操作。
演示:
>>> class Foo(object):
... def run_expression(self):
... return eval(self.expression, vars(self))
...
>>> f = Foo()
>>> f.a = 2
>>> f.b = 3
>>> f.expression = 'a + b'
>>> f.run_expression()
5