Python - 在字符串中评估字符串表达式

时间:2013-04-08 16:19:44

标签: python string expression eval

我正在尝试做这样的事情

Evaluating a mathematical expression in a string

更新 - 有关该应用的一些详细信息

应用程序'向用户公开'一些变量。公开变量的示例是user_name。然后,应用程序的用户可以创建一个名为“user_name_upper”的新变量,该变量可以设置为user_name.upper()。另一个例子是公开变量first_name和last_name,用户可以创建一个名为'full_name = last_name.upper()+','+ first_name.upper()'的新变量。使用输入框UI元素输入。所以没有钩入程序。或者将其视为像excel这样的报告,我可以创建一个新列来操纵一些已定义的变量。

此应用的用户不是程序员。但是他们可以获得一系列示例来找到他们围绕字符串操作的方法

但是,我的表达式将用于字符串操作。像“string3 = string1 + string2”之类的东西。在这里,我想将string3的值设置为string1附加的string1的值。 或者“string1 = string2.lower()”

我已经研究并得出结论,eval可以使用,但是非常危险。据我所知,ast_literal_eval()不适用于字符串操作方法,如lower() 如此处所述Why does this string not work with ast.literal_eval

有关如何解决这个问题的任何建议吗?

2 个答案:

答案 0 :(得分:1)

ast.literal_eval功能错误。它仅评估2.3"hello"等文字。

您想要的是内置函数compile()ast.parse()。这些函数IMHO(我从未使用它们)可以创建抽象语法树。看看第二段:

http://docs.python.org/2/library/ast.html

当然,让你的用户输入任意表达是危险的。但是我想你问这个问题,因为你想要搜索AST以查找有问题的代码。

答案 1 :(得分:-2)

虽然我会推荐使用其他方法,但是如果你需要使用动态变量(当你不知道它们将被调用的内容,或者将会有多少内容时),我发现字典效果很好。

例如:

def createVariable(variables, string1, string2):
    variables[string1] = string2.lower()