escribir - simbolos en python




Evaluación de expresión matemática (4)

¿Cuál es la mejor manera de implementar un programa python que tomará una cadena y generará su resultado de acuerdo con la precedencia del operador (por ejemplo: "4 + 3 * 5" dará salida a 19). Busqué en Google formas de resolver este problema, pero todas eran demasiado complejas y busco una (relativamente) simple.

aclaración: Necesito algo un poco más avanzado que eval () - Quiero poder agregar otros operadores (por ejemplo, un operador máximo - 4 $ 2 = 4) o, también estoy más interesado académicamente que profesionalmente - quiero saber cómo hacer esto


Eso es lo que hace la función "eval" en Python.

result = eval(expression)

Sin embargo, tenga en cuenta que puede hacer mucho más, principalmente funciones de llamada, por lo que para estar seguro, debe asegurarse de que no pueda acceder a los locales ni a los globales. Además, puede acceder a los métodos integrados, incluida la importación complicada, por lo que también debe bloquear el acceso a eso:

result = eval(expression, {'__builtins__': None}, {})

Pero eso es solo si necesita seguridad, es decir, si permite que alguien escriba cualquier expresión.

Por supuesto, dado que de esta manera bloquea el uso de todas las variables de locla, entonces no tiene ninguna variable para usar, por lo que para eso debe pasar solo aquellas variables a las que se debe acceder en los diccionarios.

vars = {'__builtins__': None, 'x': x}
result = eval(expression, vars, {})

o similar.


No estoy muy familiarizado con Python y cualquier método extremadamente Pythonic, pero podrías mirar el patrón de Intérprete , que está definido en el libro de Gang of Four. Está diseñado para procesar un "idioma", y las expresiones matemáticas siguen un lenguaje particular con reglas. De hecho, el ejemplo en Wikipedia es en realidad una implementación de Java de una calculadora RPN.


Si está "interesado académicamente", quiere aprender cómo escribir un analizador con precedencia de operador.

El análisis simple de arriba hacia abajo en Python es un buen artículo que construye un analizador de ejemplos para hacer exactamente lo que usted desea hacer: Evaluar expresiones matemáticas.

Recomiendo probar tu primer analizador, es uno de esos momentos "ah, así es como funciona".








math