残念ながら、このような値を生成することができるものは多すぎます。たとえば、**
は平方根を計算するために使用でき、一般に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')
)を指定してコードを解析する必要があります。
'sympy'とその' simplify'メソッドを見てください。 – Daniel
'int(eval(expr))== eval(expr)'以上のものを探していますか?ここで何を達成しようとしていますか? – Eric
@Eric多かれ少なかれ、リストや表現のセットを与えられて、評価/簡素化の間に任意の時点で非整数値を含むものを失格/除去する必要があります。 – MonkeyFodder