0

我正在尝试做这样的事情

计算字符串中的数学表达式

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

该应用程序向用户“公开”一些变量。公开变量的一个示例是 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 的值设置为附加 string2 的 string1 的值。或“string1 = string2.lower()”

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

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

4

2 回答 2

1

ast.literal_eval是错误的功能。它只评估像2.3or之类的文字"hello"

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

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

当然,让您的用户输入任意表达式是有风险的。但是我认为您会问这个问题,因为您想在 AST 中搜索有问题的代码。

于 2013-04-08T16:47:19.563 回答
-2

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

前任:

def createVariable(variables, string1, string2):
    variables[string1] = string2.lower()
于 2013-04-08T16:29:39.593 回答