在eval()期间检查字符串中是否存在非整数

2024-09-28 17:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一个字符串形式的括号内方程的各种布局的输入,例如'(3-7)/5',我想检查它的求值中的任何一点是否包含一个非整数

例如,'(3/2)+1'立即包含一个float,并且在完全求值时仍然是float,即2.5。但是像'(5/2)*2'这样的函数只是一个浮点数,然后可以作为一个整数来计算,或者,通过eval()函数,'(4/2)+3'在计算之后是一个浮点数,即使在计算过程中不存在非整数

当我试图解决这个问题时,我唯一能想到的就是在字符串中搜索/运算符,然后找到包含该除法的最小括号集。所以对于'(2+1)/4',它首先要计算2+1,然后可以检查非整数除法

有什么想法吗


Tags: 函数字符串过程eval运算符整数布局float
1条回答
网友
1楼 · 发布于 2024-09-28 17:27:36

不幸的是,有太多的东西可以产生这样的价值观。例如**可以用来计算平方根,通常传递给eval的内容可以是任何内容

我认为使用eval根本不是一个好方法。您可以使用^{}函数来获得表示表达式的AST (abstract syntax tree),然后编写自己的简单解释器来计算它。在这个解释器中,您可以在每一步执行所有需要的检查


你可以这样写:

from ast import *

def simple_expr_eval(expr):
    if not isinstance(expr, Expression):
        raise TypeError('should be an expression')
    return simple_eval(expr.body)

def simple_eval(expr):
    handlers = {
        BinOp: simple_eval_binop,
        UnaryOp: simple_eval_unaryop,
        Num: simple_eval_number,
        # ...
    }
    return handlers[type(expr)](expr)

def simple_eval_binop(binop):
    if binop.op is Mult:
        left = simple_eval(binop.left)
        right = simple_eval(binop.right):
        return left * right
    elif binop is Div:
        # here you could check whether left/right produces a floating point...
        raise ValueError('Floating operation during evaluation')
    # ...

这是一点工作,但如果你只想处理简单的表达式,那就没那么多了。在这些函数中,您可以自由地简化/交换节点,以更改表达式的计算方式

您还应该通过指定eval求值模式(即eval(your_expr, '<fake-filename>', 'eval'))来解析代码

相关问题 更多 >