2017-11-07 10 views
-1

算術演算と論理演算の両方で式を評価しようとしています。私は実際に出力と混同しています。例えば論理演算子でPythonの式を評価する

eval('100 >= 1000 & 100 >= 95') 
True ==> Wrong 

eval('400 >= 0 & 400 >= 0') 
True ==> Right 

私は&オペレータ後の状態の出力を提供します。論理演算をevalで使用することはできません

eval('400 >= 5000 | 400 >= 0') 
False ==> Wrong 

OR演算子を使用すると、出力が異なります。私は式の中float値で試したとき

、それは例外TypeError

eval('400.0 >= 0 & 400.0 >= 0') 


Traceback (most recent call last): 
    File "<pyshell#70>", line 1, in <module> 
    eval('400.0 >= 0 & 400.0 >= 0') 
    File "<string>", line 1, in <module> 
TypeError: unsupported operand type(s) for &: 'int' and 'float' 

は、論理演算することなく、ここに混乱

eval('400.0 >= 0') 
True ==> Right 

を、それを使用して投げます。

+0

は、私は疑問に思うなぜあなたは '使用している|'と '&' – Elazar

+0

は私がする必要がありますこのような表現を評価する。 'aa> = 1000 AND bb> = 95'である。私はaaとbbの値を代入して、 – Gopi

+0

を評価しています。 'and'と' or 'を使用します。 – Elazar

答えて

3

Python論理演算子は、andor - &|はビット演算子です。だから、欲しい:

eval('400 >= 5000 or 400 >= 0') 

これは言われて、eval()はそれにユーザ入力を渡さない非常に安全ではありません...

+0

これは本当の問題の答えですが、質問への答えはありません:) – Elazar

+0

確かにエラザール - 私は根本的な問題に対処するともっと役に立つと思った

1

ビット単位論理演算子の優先度は等しくなります。ここにはevalに固有のものはありません。

>>> eval('(400 >= 5000) | (400 >= 0)') 
True 

あなたは右優先させるためにorを使用する必要があります。

>>> eval('400 >= 5000 or 400 >= 0') 
True 
@bruno desthuilliersで述べたように

evalすることで、ユーザの入力に使用すべきものではありません。おそらく、ユーザー入力とPython操作の間の独自のマッピングを構築するべきでしょう。 Python式を実際に作成したい場合は、the ast moduleを見てみてください。