gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:14 26 4
gpt4 key购买 nike

我正在编写一个程序,其中一个方程作为字符串输入,然后计算。到目前为止,我想出了这个:

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

我需要这个等式的字符串版本和计算版本。但是,eval 是一个非常危险的函数。但是,使用 int() 不起作用,因为它是一个等式。是否有 Python 函数可以像输入数字一样计算字符串中的数学表达式?

最佳答案

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

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

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

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

它是第 3 方扩展模块,所以在这里可能有点矫枉过正,但它绝对比 eval 更安全,并且支持相当多的功能(包括 numpy数学操作)。如果还支持“变量替换”:

>>> 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 object at 0x0000023BDEADB400>

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

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

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

Safely evaluate an expression node or a string containing a Python literal or container display. The string or node provided may only consist of the following Python literal structures: strings, bytes, numbers, tuples, lists, dicts, sets, booleans, and None.

关于python - 安全地评估简单的字符串方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43836866/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com