当前位置: 首页 > 面试题库 >

安全地评估简单的字符串方程式

张权
2023-03-14
问题内容

我正在编写一个程序,其中将方程式作为字符串输入,然后求值。到目前为止,我已经提出了:

test_24_string = str(input("Enter your answer: "))
test_24 = eval(test_24_string)

我既需要此方程式的字符串版本,也需要评估的版本。但是,这eval是非常危险的功能。int()但是,使用是行不通的,因为这是一个方程式。是否存在一个Python函数,该函数将评估字符串中的数学表达式,就像输入数字一样?


问题答案:

一种方法是使用numexpr。它主要是用于优化(和多线程)numpy操作的模块,但它也可以处理数学python表达式:

>>> import numexpr
>>> numexpr.evaluate('2 + 4.1 * 3')
array(14.299999999999999)

您可以调用.item结果以获取类似python的类型:

>>> numexpr.evaluate('17 / 3').item()
5.666666666666667

它是一个第三方扩展模块,因此在这里可能会完全被淘汰,但是它绝对比其他应用程序更安全,eval并且支持许多功能(包括numpymath操作)。如果还支持“变量替换”:

>>> b = 10
>>> numexpr.evaluate('exp(17) / b').item()
2415495.27535753

python标准库的一种方法,尽管非常有限ast.literal_eval。它适用于Python中最基本的数据类型和文字:

>>> import ast
>>> ast.literal_eval('1+2')
3

但是以更复杂的表达式失败,例如:

>>> ast.literal_eval('import os')
SyntaxError: invalid syntax

>>> ast.literal_eval('exec(1+2)')
ValueError: malformed node or string: <_ast.Call html" target="_blank">object at 0x0000023BDEADB400>

不幸的是,除了+-不可能的任何运算符:

>>> ast.literal_eval('1.2 * 2.3')
ValueError: malformed node or string: <_ast.BinOp object at 0x0000023BDEF24B70>

我在此处复制了部分文档,其中包含受支持的类型:

安全地评估表达式节点或包含Python文字或容器显示的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,字节,数字,元组,列表,字典,集合,布尔值和无。



 类似资料:
  • 问题内容: 一个简单的问题需要一个简单的答案。 例如: 如何以简单易懂的方式编写评估方法,该方法将适用于任何给定的格式良好的xml和xpath。 显然,有很多方法可以实现,但是大多数方法似乎很冗长。 我缺少/可以实现此目的的图书馆的任何简单方法吗? 对于返回多个节点的情况,我只需要它的字符串表示形式。 问题答案: 您可以使用Java SE完成以下工作:

  • 问题内容: 我正在制作一个进行一些数据处理的webapp,因此经常发现自己将字符串(来自URL或文本文件)解析为Python值。 我使用的是一种类似于eval的安全版本的函数(除非它不能读取字符串,而是保留字符串): …但是,这对我来说似乎很难看。有没有更干净的方法可以做到这一点?我发现了类似这样的旧讨论,但是我想知道是否没有一种快速简单的方法(例如我不知道的库函数,还是一个聪明的单行代码?)。

  • 本文向大家介绍Java评估算术字符串,包括了Java评估算术字符串的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我如何布尔计算包含布尔表达式的字符串?喜欢: 用户应该能够定义自己的变量(),并定义自己的布尔表达式()。因此,我将所有表达式仅作为字符串使用。我如何评估它们? 问题答案: 您可以使用Nambari评论的ScriptEngine: 打印0。 还要注意,该表达式不是布尔表达式,而是按位运算。

  • 问题内容: 如果JSP中存在某些值,则需要隐藏一个元素 值存储在列表中,所以我尝试了: 但是,它不起作用。 如何评估列表是否包含JSTL中的值,列表和值是字符串。 问题答案: 可悲的是,我认为JSTL除了支持所有元素的迭代来解决这个问题外,不支持任何其他功能。过去,我在核心标签库中使用过forEach方法: 运行之后,如果myList包含myValue,则$ {contains}将等于“ true

  • 问题内容: 我必须从D / B检索一组列值并将其作为条件进行检查。 例如,我将有像字符串,在d / B柱。(值是一直比较的值)。我将在代码中声明一个变量值,我应该评估这种情况。 我怎样才能做到这一点??任何帮助都受到赞赏。谢谢。 问题答案: 这是使用标准(Java 1.6+)脚本库的示例: