首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在eval()过程中检查字符串中是否存在非整数

在eval()过程中检查字符串中是否存在非整数
EN

Stack Overflow用户
提问于 2017-03-12 21:19:42
回答 1查看 61关注 0票数 0

给定字符串形式的各种方括号方程式的输入,例如'(3-7)/5',我希望检查在它的计算中的任何一点,它是否包含一个非整数。

例如,'(3/2)+1'立即包含一个float,并且在完全计算时仍然是一个float,即2.5。但是像'(5/2)*2'这样的东西简单地说是一个浮点数,然后可以被计算为整数,或者,通过eval()函数,'(4/2)+3'在计算后将是一个浮点数,即使在它的计算过程中不存在非整数。

在尝试解决这个问题时,我唯一能想到的就是在字符串中搜索/运算符,然后找到涉及该除法的最小括号集。因此对于'(2+1)/4',它首先必须计算2+1,然后才能检查非整数除法……

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2017-03-12 21:28:27

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

我认为使用eval根本不是一种好的方法。您可以使用ast.parse函数来获取表示表达式的AST (abstract syntax tree),然后编写自己的简单解释器来计算它。在这个解释器中,你可以在每一步做你想做的所有检查。

您可以编写类似这样的代码:

代码语言:javascript
运行
复制
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'))来解析代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42747908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档