0

我想构建一个类,该类能够在运行时采用一些用户定义的表达式并基于它们和该类拥有的一些预定义变量进行计算,例如,用户将知道变量 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 时都会有大量样板输入据我所知,输入始终是一组预定义的变量。

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

4

1 回答 1

2

要将表达式计算为 Python,请使用eval()函数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
于 2013-07-22T10:57:49.320 回答