Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-在字符串中计算字符串表达式_Python_String_Expression_Eval - Fatal编程技术网

Python-在字符串中计算字符串表达式

Python-在字符串中计算字符串表达式,python,string,expression,eval,Python,String,Expression,Eval,我正试着做这样的事情 更新-有关应用程序的一些详细信息 应用程序向用户“公开”一些变量。公开变量的一个示例是user_name。然后,应用程序的用户可以创建一个名为“user\u name\u upper”的新变量,该变量可以设置为user\u name.upper()。另一个示例是公开变量first_name和last_name,用户可以创建一个名为“full_name=last_name.upper()+”、“+first_name.upper()”的新变量。这是使用输入框UI元素输入的。

我正试着做这样的事情

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

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

此应用程序的用户不是程序员。但是可以给他们一个例子列表,让他们找到处理字符串的方法

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

我已经研究并得出结论,eval可以使用,但非常危险。据我所知,ast_literal_eval()不适用于lower()等字符串操作方法 如本文所述


有什么建议吗?

尽管我会推荐其他使用方法,但如果您需要使用动态变量(当您不知道它们将被称为什么或有多少时),我发现字典工作得很好

例:


ast.literal\u eval
是错误的函数。它只计算像
2.3
“hello”
这样的文本

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


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

你为什么要这么做?也许有一种更好的方法可以从一开始就组织你的问题,这样就没有必要了。这是一个科学应用程序。用户可以选择“创建”自己的变量,因此这将涉及需要清理的用户输入。你还推荐什么方法?让用户使用你的库编写python脚本我建议学习如何使用lexer/解析器。这似乎是一个受欢迎的选择,尽管我从未使用过。我只是用我自己的。这个应用程序的更多细节。应用程序向用户“公开”一些变量。例如用户名。然后,应用程序的用户可以创建一个名为“user\u name\u upper”的新变量,该变量可以设置为user\u name.upper()。另一个例子是变量“first_name”和“last_name”可用,用户可以创建一个名为“full_name=last_name.upper()+”、“+first_name.upper()”的新变量。这是使用输入框UI元素输入的。因此,程序中没有挂钩。希望这有助于感谢回应。不确定这是否有意义。请重新访问我的问题,我已对其进行了编辑,以添加有关apps/usersThanks@Eike的更多信息。这可能是一个很好的方法。根据你的回答,我搜索了更多,找到了这个[链接]。对字符串表达式这样做有什么不利之处吗?可以注入恶意代码吗?我认为AST有助于消除这个问题,对吗?是的,你的用户可能会输入恶意代码并试图欺骗你。让它真正安全可能需要一些认真的思考。但是,防止用户非自愿地使程序崩溃应该不是太难。创建一组程序接受的AST节点,并拒绝处理任何其他内容。如果您的程序确实是一个可公开访问的web服务器,您可能应该考虑另一种解决方案。无论如何,你的灵感应该来自这幅XKCD漫画:谢谢@Eike…将你的答案标记为正确答案。喜欢xkcd动画片:)
def createVariable(variables, string1, string2):
    variables[string1] = string2.lower()