2013-07-22 28 views
0

我想要构建一个能够在运行时采用几个用户定义表达式的类,并根据它们和该类拥有的一些预定义变量(例如,用户将知道变量a,b,C & d存在:在运行时执行用户定义表达式的python类

伪代码:

>>> 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,因为我知道输入总是一组预定义的变量。

有没有人有类似的经验,或者对如何构建这样的程序有任何想法?

+0

好老邪的eval()?但真正的重点是......你为什么需要这样的东西? –

+0

但我会甚至能够''eval()'访问类的内部变量,而不做大量的字符串操作? –

+0

是的。这就是为什么它被称为* evil * eval:D –

回答

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 
+0

多数民众赞成在此非常感谢,在这种情况下不应该有任何恶意攻击的麻烦,没有个人信息,他们将能够做的就是崩溃自己的程序:) –