给定字符串形式的各种方括号方程式的输入,例如'(3-7)/5',我希望检查在它的计算中的任何一点,它是否包含一个非整数。
例如,'(3/2)+1'立即包含一个float,并且在完全计算时仍然是一个float,即2.5。但是像'(5/2)*2'这样的东西简单地说是一个浮点数,然后可以被计算为整数,或者,通过eval()函数,'(4/2)+3'在计算后将是一个浮点数,即使在它的计算过程中不存在非整数。
在尝试解决这个问题时,我唯一能想到的就是在字符串中搜索/运算符,然后找到涉及该除法的最小括号集。因此对于'(2+1)/4',它首先必须计算2+1,然后才能检查非整数除法……
有什么想法吗?
发布于 2017-03-12 21:28:27
不幸的是,有太多的东西可以产生这样的价值。例如,**可以用来计算平方根,通常传递给eval的内容可以是任何内容。
我认为使用eval根本不是一种好的方法。您可以使用ast.parse函数来获取表示表达式的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'))来解析代码。
https://stackoverflow.com/questions/42747908
复制相似问题