Tengo una expresión booleana en una cadena. p.ej. . ¿Hay una manera simple de analizar y evaluar esta cadena por lo que devolverá True
(en este caso).prueba una expresión booleana en una cadena de Python
ast.literal_eval("20 < 30")
no funciona.
Tengo una expresión booleana en una cadena. p.ej. . ¿Hay una manera simple de analizar y evaluar esta cadena por lo que devolverá True
(en este caso).prueba una expresión booleana en una cadena de Python
ast.literal_eval("20 < 30")
no funciona.
>>> eval("20<30")
True
¿Es esta una cadena definida por el usuario, o una que está definiendo?
Si se trata de una cadena que está creando, se puede usar eval
(eval("20 < 30")
), pero si la cadena está dada por el usuario, es posible que desee desinfectar primero ...
Lo creé. No se preocupe :) Eval es de hecho un agujero de seguridad muy bueno y muy GRANDE. – RickyA
ast.literal_eval
no debería trabajar desde (de los documentos) "La cadena o nodo proporcionado solo puede consistir en las siguientes estructuras literales de Python: cadenas, números, tuplas, listas, dictos, booleanos y Ninguno.". La expresión 20<30
requiere algún tipo de evaluación, antes de que devuelva a bool
.
Una sugerencia más segura sería dividir la cadena en el operador y literal_eval
en cada lado antes de pasar a eval
, es decir.
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))
Envolver la cosa en una cláusula try, except
cogerá algunos errores de entrada al evaluar lhs,rhs
.
Gracias se olvidó de eso – RickyA