我在写一个程序,其中一个方程作为字符串输入,然后计算。到目前为止,我已经得出了这个结论:
test_24_string = str(input("Enter your answer: "))
test_24 = eval(test_24_string)
我需要这个方程的字符串版本和计算版本。然而,eval
是一个非常危险的函数。但是,使用int()
是行不通的,因为它是一个等式。有没有一个Python函数可以从一个字符串中计算一个数学表达式,就像输入一个数字一样?
我在写一个程序,其中一个方程作为字符串输入,然后计算。到目前为止,我已经得出了这个结论:
test_24_string = str(input("Enter your answer: "))
test_24 = eval(test_24_string)
我需要这个方程的字符串版本和计算版本。然而,eval
是一个非常危险的函数。但是,使用int()
是行不通的,因为它是一个等式。有没有一个Python函数可以从一个字符串中计算一个数学表达式,就像输入一个数字一样?
5条答案
按热度按时间iklwldmw1#
一种方法是使用numexpr。它主要是一个优化(和多线程)numpy操作的模块,但它也可以处理数学Python表达式:
你可以在结果上调用
.item
来获得一个类似Python的类型:它是一个第三方扩展模块,所以它可能是完全矫枉过正,但它肯定比
eval
更安全,并支持相当多的功能(包括numpy
和math
操作)。如果还支持“变量替换”:使用python标准库的一种方法是
ast.literal_eval
,尽管非常有限。它适用于Python中最基本的数据类型和文字:但在更复杂的表达式中失败,例如:
不幸的是,除了
+
和-
之外的任何运算符都是不可能的:我在这里复制了包含支持类型的部分文档:
安全计算表达式节点或包含Python文本或容器显示的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串、字节、数字、元组、列表、字典、集合、布尔值和None。
1sbrub3j2#
编写后缀表达式计算器并不困难。下面是一个工作示例。(在github上也有available。)
使用方法:
xvw2m8pv3#
我遇到了同样的问题,并解决了这个问题:
我看不出来里面可能还有安全问题。如果有安全问题,请告诉我。
guz6ccqo4#
我这么做是为了回答同样的问题。它很容易适应。
测试与使用
c6ubokkw5#
公认的答案是不正确的。
numexpr.evaluate
依赖于eval
。请参阅https://github.com/pydata/numexpr/issues/323了解如何在用户输入上使用此库可能出错的信息。相反,这里是一个由Paul McGuire编写的用于算术表达式的
eval
免费计算器:https://github.com/pyparsing/pyparsing/blob/master/examples/fourFn.py .艰苦的工作已经完成了。如果您将以下代码片段添加到示例代码的当前形式,您将拥有一个能够进行算术运算的safe_eval
函数:请注意,Paul的示例代码旨在演示如何使用解析器,而不是提供一个算术API,因此您可能希望稍微修改一下代码以符合您的约定。标签:Safe way to parse user-supplied mathematical formula in Python