2012-05-14 2 views
5

私は文字列にブール式を持っています。例えば。 。この文字列を解析して評価する簡単な方法があるので、True(この場合)を返します。Python文字列でブール式をテストします

ast.literal_eval("20 < 30")は機能しません。

答えて

2
>>> eval("20<30") 
True 
+1

ありがとうございました。その1つを忘れました – RickyA

2

これはユーザー定義の文字列か、定義している文字列ですか。

それはあなたが作成している文字列なら、あなたはevaleval("20 < 30"))を使用することができますが、文字列がユーザによって指定された場合、あなたが最初にそれをサニタイズすることがあります...

+2

私はそれを作成します。心配はありません:)エバールは本当に素晴らしいと非常に大きなセキュリティホールです。 – RickyA

0

ast.literal_evalが動作してはなりません(docsから) "指定された文字列またはノードは、文字列、数値、タプル、リスト、辞書、ブール値、およびなしの次のPythonリテラル構造のみで構成されます。"式20<30は、boolを返す前に何らかの評価が必要です。

evalに渡す前に、オペレータとliteral_evalの両側で文字列を分割することをお勧めします。 lhs,rhsを評価する際に、いくつかの入力エラーをキャッチしますtry, except句の事をラップ

import ast 

expr = "20 < 30" 
operator = "<" 
lhs,rhs = map(ast.literal_eval, map(str.strip, expr.split(operator))) 
eval("%s %s %s"%(lhs,operator,rhs)) 

関連する問題