logo

ejecutivo() en Python

ejecutivo() La función se utiliza para la ejecución dinámica de programas Python que pueden ser una cadena o un código objeto. Si es una cadena, la cadena 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 puedan usar 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 Ninguno .

Sintaxis del ejecutivo de Python()

ejecutivo(objeto[, globales[, locales]])

Parámetros:



  • objeto: Como ya se dijo, esto puede ser una cadena o un código objeto.
  • globales: Esto puede ser un diccionario y el parámetro es opcional.
  • lugareños: Puede ser un objeto de mapeo y también es opcional.

¿Cómo funciona exec() en Python?

En este ejemplo, podemos ver la ejecución dinámica en Python usando elexec()>función. Demuestra la capacidad de ejecutar código contenido en un objeto de forma dinámica, mostrando el concepto de ejecución dinámica en Python.

Python3




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

>

>

Producción

The sum of 5 and 10 is 15>

Advertencia o limitaciones

Antes de utilizar cualquier método dentro de la función exec(), se debe tener en cuenta qué son compatibles con todas las funciones exec(). Para ver esto podemos usar la función dir().

En este ejemplo, podemos ver la ejecución dinámica en Python como eldir()>La función se ejecuta dentro delexec()>función, que ilustra el concepto de ejecución dinámica en Python.

Python3




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

>

>

Producción

['__annotations__', '__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', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', '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 podrían 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 utilizar para ambos campos. Veamos cómo funciona el código al pasar solo el parámetro global.

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 __builtins__ y no se muestran otras funciones matemáticas como en el ejemplo anterior. Esto significa que solo se admitirán __builtins__ para el parámetro de objeto. Esto sugiere que todas las demás funciones están restringidas en el objeto. Para demostrarlo, intentemos trabajar con una función matemática y veamos qué sucede.

Python3




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

>

>

Este ejemplo debería haber impreso 120 como salida, pero en su lugar muestra Sin salida y genera una excepción. Aunque importamos el módulo matemático, el método factorial() no funcionó debido a las restricciones que establecimos 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().

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 hecho() , que está definido por el usuario.

Python3

alineación de texto css




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

>

>

Producción

120>

En este escenario, al pasar parámetros globales y locales, podemos adaptar el comportamiento del código ejecutado a nuestros requisitos específicos, mostrando la versatilidad de la ejecución dinámica en Python.

Python3




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

>

>

Producción

['iter', 'sum']>

La ejecución dinámica en Python permite la ejecución de métodos específicos comosum()>yiter()>junto con métodos integrados dentro delexec()>función, lo que demuestra la flexibilidad de la ejecución dinámica en Python. 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__ de esta manera:

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']>