Cómo usar las funciones eval y exec en Python

Cómo usar las funciones eval y exec en Python

Este artículo cubrirá una guía sobre el uso de funciones "eval" y "ejecutiva" disponibles en la biblioteca estándar de Python. Estas funciones se pueden utilizar en una variedad de formas para evaluar y ejecutar expresiones de Python. El uso de ambas funciones se puede entender mejor a través de ejemplos. Algunos ejemplos se enumeran a continuación. Todas las muestras de código en este artículo se prueban con Python 3.9.5 en Ubuntu 21.04.

Uso de Eval para evaluar las expresiones de Python

La función de evaluación se puede utilizar para evaluar las expresiones de Python y obtener un valor de retorno de ellas. Cualquier expresión de Python que deba evaluarse se suministra a la función EVEV en forma de argumento obligatorio. Las expresiones aprobadas como un argumento a las funciones de evaluación tienen acceso completo a las funciones de Python incorporadas, así como a los espacios de nombres globales y locales. Eche un vistazo a la muestra de código a continuación:

n = 1
resultado = eval ("n * 2")
Imprimir (resultado)
eval ("imprimir (n * 2)")

Las citas triples en el ejemplo anterior se utilizan para presentar las cadenas "tal cual", sin escapar de los caracteres especiales o hacer otras modificaciones. La primera declaración en la muestra de código define una variable llamada "n" que tiene un valor de 1. A continuación, se llama al método EVIS suministrándole una expresión de Python en formato de cadena. En la expresión de cadena, se ha hecho referencia a la variable "n", ya que ya está disponible en el espacio de nombres. La siguiente declaración imprime la salida de la variable "resultado". La última declaración ilustra que puede llamar directamente a las funciones de Python incorporadas en la expresión suministrada a la función EVS como un argumento.

Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

2
2

Como puede ver en la salida anterior, ambas declaraciones de impresión producen el mismo resultado.

Opcionalmente, puede proporcionar diccionarios personalizados para espacios de nombres globales y locales para restringir y controlar objetos de espacio de nombres permitidos. Eche un vistazo a la muestra de código a continuación:

n = 1
resultado = eval ("n * 2")
Imprimir (resultado)
eval ("print (m * 2)", 'm': 1)
eval ("imprimir (n * 2)", 'm': 1)

En la declaración EVEM en la cuarta línea, se suministra un argumento adicional donde se utiliza un diccionario de objetos de espacio de nombres globales personalizados. Cuando suministra un diccionario de objetos globales personalizados, Eval utiliza solo métodos y mapeos incorporados incluidos en el diccionario. Si usa un diccionario global vacío (""), solo se permiten métodos incorporados y ni siquiera las importaciones personalizadas. Dado que el objeto "M" en el Diccionario Global tiene un valor de 1, la declaración EVALO puede usar una referencia para "M". En la última declaración, el objeto "m" está disponible en el diccionario global, pero no en la variable "n", como se ha suministrado un diccionario personalizado de objetos globales. La última declaración lanzará un error ya que no hay definición para "n" en el diccionario de espacio de nombres global personalizado.

Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

2
2
Rastreo (llamadas recientes más última):
Archivo "/inicio/usuario/descargas/./prueba.py ", línea 7, en
eval ("imprimir (n * 2)", 'm': 1)
Archivo "", línea 1, en
NameError: el nombre 'n' no está definido

Puede usar un diccionario para objetos locales del espacio de nombres de la misma manera que los objetos globales del espacio de nombres. Simplemente suministre un diccionario personalizado como un tercer argumento para que la función EVIS lo use como mapeo para objetos de espacio de nombres locales.

Uso de EXEC para ejecutar el código Python

La función EXEC funciona de manera similar a la función eval con algunas diferencias. La expresión suministrada a la función EXEC puede ser una cadena o cualquier otro objeto Python válido que contenga un código Python válido. En comparación, la función eval solo toma expresiones de cadena. También puede proporcionar diccionarios personalizados para objetos globales y locales del espacio de nombres y el método EXEC se comporta de la misma manera que la función Eval cuando se utilizan asignaciones de espacio de nombres personalizados. Otra diferencia con la función EVAL es que la función EXEC siempre devuelve un valor "ninguno". Eche un vistazo a la muestra de código a continuación:

n = 1
resultado = exec ("n * 2")
Imprimir (resultado)
exec ("imprimir (n * 2)")
resultado = "imprimir (n * 2)"
ejecutora (resultado)

El bloque de código es muy similar a la muestra de código utilizada en el ejemplo de evaluación, pero en lugar de la función eval, ahora se ha utilizado la función EXEC. Después de ejecutar la muestra de código anterior, debe obtener la siguiente salida:

Ninguno
2
2

Como se indicó anteriormente, la función EXEC siempre devuelve un valor de "ninguno", por lo que la tercera línea produce "Ninguno" como la salida. A continuación, la instrucción EXEC en la cuarta línea utiliza la función de "impresión" para producir "2" como salida. A la variable de resultado se le asigna un nuevo valor al proporcionarle una instrucción de código Python válida en el formulario de cadena. La última declaración muestra que la función EXEC puede llamar directamente a los objetos de código que contienen un código Python válido. También produce "2" como salida.

Consideraciones de Seguridad

Mientras usa las funciones Eval y Exec, debe tener en cuenta que ambas funciones permiten la ejecución de expresiones y bloques de código de Python arbitrarios. Si no consciente conscientemente de lo que se está utilizando en las expresiones, estas declaraciones pueden hacer daño al entorno en el que está trabajando. Por ejemplo, puede modificar, eliminar o hacer cambios irreversibles en los archivos almacenados en el host utilizando los módulos "OS" y "SYS" y sus métodos en las funciones EVAL y EXEC. El módulo de "subprocesos" en Python le permite iniciar nuevos procesos y ejecutar comandos de shell. Expresiones en los métodos EVAL y EXEC que utiliza el módulo de subprocesos puede conducir a comportamientos no deseados si no tiene cuidado con lo que se está utilizando en las expresiones.

Conclusión

Los métodos de evaluación y ejecutivo le permiten procesar y ejecutar fragmentos de código de python. Puede suministrar declaraciones de evaluación a otras funciones de Python como argumentos, ya que siempre devuelven un valor, algo similar a las funciones de Lambda en Python. Del mismo modo, puede usar la función EXEC para ejecutar el código Python predefinido. Se usa más comúnmente donde se necesita leer el código de Python de un archivo y se ejecuta en otro.