私は文字列にブール式を持っています。例えば。 。この文字列を解析して評価する簡単な方法があるので、True
(この場合)を返します。Python文字列でブール式をテストします
ast.literal_eval("20 < 30")
は機能しません。
私は文字列にブール式を持っています。例えば。 。この文字列を解析して評価する簡単な方法があるので、True
(この場合)を返します。Python文字列でブール式をテストします
ast.literal_eval("20 < 30")
は機能しません。
>>> eval("20<30")
True
これはユーザー定義の文字列か、定義している文字列ですか。
それはあなたが作成している文字列なら、あなたはeval
(eval("20 < 30")
)を使用することができますが、文字列がユーザによって指定された場合、あなたが最初にそれをサニタイズすることがあります...
私はそれを作成します。心配はありません:)エバールは本当に素晴らしいと非常に大きなセキュリティホールです。 – RickyA
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))
。
ありがとうございました。その1つを忘れました – RickyA