我正在尝试做这样的事情
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
有关如何解决这个问题的任何建议吗?
答案 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()