exec() en Python

La función exec() se utiliza para la ejecución dinámica del programa Python, que puede ser una string o un código de objeto. Si es una string, la string se analiza como un conjunto de declaraciones de Python que luego se ejecuta a menos que ocurra un error de sintaxis y si es un código objeto, simplemente se ejecuta. Debemos tener cuidado de que las declaraciones de retorno no se usen fuera de las definiciones de funciones, ni siquiera dentro del contexto del código pasado a la función exec(). No devuelve ningún valor, por lo tanto, devuelve None

Sintaxis: 

exec(object[, globals[, locals]])

Puede tomar tres parámetros:  

  • objeto: como ya se dijo, puede ser una string o un código de objeto
  • globales: esto puede ser un diccionario y el parámetro es opcional
  • locales: esto puede ser un objeto de mapeo y también es opcional

Ahora veamos cómo funciona esta función. En el siguiente código, hemos usado un código objeto y lo ejecutamos usando la función exec(). Acabamos de tomar el parámetro del objeto y omitimos los otros dos campos. 

Ejemplo:  

Python3

prog = 'print("The sum of 5 and 10 is", (5+10))'
exec(prog)

Salida: 
La suma de 5 y 10 es 15

Advertencia o limitaciones

Antes de usar cualquier método dentro de la función exec(), se debe tener en cuenta lo que todas las funciones admiten exec(). Para ver esto podemos usar la función dir(). 

Ejemplo:  

Python3

# The math class is used to include all the
# math functions
from math import *
exec("print(dir())")

Producción: 

['__builtins__', '__cached__', '__doc__', '__file__',
 '__loader__', '__name__', '__package__', '__spec__', 
'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 
'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 
'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial',
 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 
'hypot', 'inf', 'isclose', 'isfinite', 'isinf',
'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 
'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin',
 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

Parámetros globales y locales

Python nos permite restringir el uso de varias variables y métodos mediante el uso de parámetros globales y locales, que pueden no ser necesarios. Estos parámetros locales y globales se utilizan para variables locales o globales, principalmente diccionarios. El parámetro global supera si falta el local, lo que significa que global se puede usar para ambos campos. Veamos cómo funciona el código al pasar solo el parámetro global. 

Ejemplo:  

Python3

# Here we have passed an empty dictionary
from math import *
exec("print(dir())", {})

Producción: 

['__builtins__']

Entonces vemos que al pasar un diccionario vacío como parámetro global, solo se muestran los __incorporados__ y no se muestran otras funciones matemáticas como en el ejemplo anterior. Esto significa que solo los __incorporados__ serán compatibles con el parámetro de objeto. Esto sugiere que todas las demás funciones están restringidas en el objeto. Para probarlo, intentemos trabajar con una función matemática y veamos qué sucede. 

Ejemplo:  

Python3

# An exception will be raised
from math import *
exec("print(factorial(5))", {})

Producción: 

No Output

Este ejemplo debería haber impreso 120 como salida, pero en su lugar, muestra Sin salida y genera una excepción. Aunque hemos importado el módulo matemático, el método factorial() no funcionó debido a las restricciones que hemos establecido al pasar el parámetro global. 
También podemos permitir que se ejecuten algunas de las muchas funciones. Supongamos que queremos que todos los demás módulos matemáticos estén restringidos excepto la función factorial(). 

Ejemplo:  

Python3

# factorial() will be executed
from math import *
exec("print(factorial(5))", {"factorial":factorial})

Producción: 

120

También podemos cambiar el nombre de estos métodos predefinidos y darles un nombre definido por el usuario durante la ejecución. Podemos cambiar el nombre de la función de factorial() a fact() , que está definido por el usuario. 

Ejemplo: 

Python3

# factorial() renamed as fact
from math import *
exec('print(fact(5))', {'fact': factorial})

Producción: 

120

Ahora veamos qué más podemos hacer al pasar los parámetros globales y locales. Usando parámetros locales podemos implementar las funciones de acuerdo a nuestra necesidad. 

Ejemplo:  

Python3

from math import *
exec("print(dir())", {"built" : __builtins__}, {"sum": sum, "iter": iter})

Producción: 

['dir', 'print', 'sum']

A través de esto, solo los métodos sum e iter junto con todos los métodos integrados se pueden ejecutar dentro de la función exec(). 

También podemos restringir el uso de __builtins__ así:  

Python3

#__builtins__ has been restricted using None
from math import *
exec("print(dir())", {"__builtins__" : None}, {"sum": sum, "print": print, "dir": dir})

Producción: 

['dir', 'print', 'sum']

Aquí solo se ejecutarán los métodos sum, print y dir dentro de la función exec() y no todos los métodos integrados.
Este artículo es una contribución de Chinmoy Lenka . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *