exec() La funció s'utilitza per a l'execució dinàmica de programes Python que poden ser una cadena o un codi objecte. Si és una cadena, la cadena s'analitza com un conjunt d'instruccions de Python que després s'executa tret que es produeixi un error de sintaxi i si es tracta d'un codi objecte, simplement s'executa. Hem de tenir cura que les declaracions de retorn no es poden utilitzar fora de les definicions de funció ni tan sols dins del context del codi passat a la funció exec(). No retorna cap valor, per tant retorna Cap .
Sintaxi de Python exec().
exec(objecte[, globals[, locals]])
Paràmetres:
- objecte: Com ja s'ha dit, pot ser una cadena o un codi objecte
- globals: Pot ser un diccionari i el paràmetre és opcional
- locals: Aquest pot ser un objecte de mapatge i també és opcional
Com funciona exec() a Python?
En aquest exemple, podem veure l'execució dinàmica a Python utilitzant elexec()>
funció. Demostra la capacitat d'executar codi contingut en un objecte de manera dinàmica, mostrant el concepte d'execució dinàmica a Python.
Python 3
prog> => 'print('The sum of 5 and 10 is', (5+10))'> exec> (prog)> |
>
>Sortida
The sum of 5 and 10 is 15>
Advertència o limitacions
Abans d'utilitzar qualsevol mètode dins de la funció exec() cal tenir en compte què admeten totes les funcions exec(). Per veure-ho podem utilitzar la funció dir().
En aquest exemple, podem veure l'execució dinàmica a Python com adir()>
la funció s'executa dins deexec()>
funció, que il·lustra el concepte d'execució dinàmica a Python.
Python 3
# The math class is used to include all the> # math functions> from> math> import> *> exec> (> 'print(dir())'> )> |
>
>Sortida
['__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àmetres globals i locals
Python ens permet restringir l'ús de diverses variables i mètodes mitjançant l'ús de paràmetres globals i locals, que potser no són necessaris. Aquests paràmetres locals i globals s'utilitzen per a variables locals o globals principalment diccionaris. El paràmetre global supera si falta el local, la qual cosa significa que el global es pot utilitzar per als dos camps. Vegem com funciona el codi en passar només el paràmetre global.
Python 3
obj en java
# Here we have passed an empty dictionary> from> math> import> *> exec> (> 'print(dir())'> , {})> |
>
>Sortida
['__builtins__']>
Així doncs, veiem que en passar un diccionari buit com a paràmetre global, només es mostren els __builtins__ i no es mostren altres funcions matemàtiques com a l'exemple anterior. Això vol dir que només els __builtins__ seran compatibles amb el paràmetre d'objecte. Això suggereix que totes les altres funcions estan restringides a l'objecte. Per demostrar-ho, intentem treballar amb una funció matemàtica i veure què passa.
Python 3
# An exception will be raised> from> math> import> *> exec> (> 'print(factorial(5))'> , {})> |
>
>
Aquest exemple hauria d'haver imprès 120 com a sortida, però en canvi, mostra No sortida i genera una excepció. Tot i que hem importat el mòdul matemàtic, el mètode factorial() no va funcionar a causa de les restriccions que hem establert en passar el paràmetre global.
També podem permetre que s'executin algunes de les moltes funcions. Suposem que volem que tots els altres mòduls matemàtics estiguin restringits excepte la funció factorial().
Python 3
# factorial() will be executed> from> math> import> *> exec> (> 'print(factorial(5))'> , {> 'factorial'> :factorial})> |
>
>Sortida
120>
També podem canviar el nom d'aquests mètodes predefinits i donar-los un nom definit per l'usuari durant l'execució. Podem canviar el nom de la funció de factorial () a fet () , que està definit per l'usuari.
Python 3
# factorial() renamed as fact> from> math> import> *> exec> (> 'print(fact(5))'> , {> 'fact'> : factorial})> |
>
>Sortida
120>
En aquest escenari, passant paràmetres globals i locals, podem adaptar el comportament del codi executat als nostres requisits específics, mostrant la versatilitat de l'execució dinàmica a Python.
Python 3
from> math> import> *> exec> (> 'print(dir())'> , {> 'built'> : __builtins__}, {> 'sum'> :> sum> ,> 'iter'> :> iter> })> |
>
>Sortida
['iter', 'sum']>
L'execució dinàmica en Python permet l'execució de mètodes específics com arasum()>
iiter()>
juntament amb mètodes integrats dins delexec()>
funció, demostrant la flexibilitat de l'execució dinàmica en Python. Amb això, només es poden executar els mètodes suma i iter juntament amb tots els mètodes integrats dins de la funció exec(). També podem restringir l'ús de __builtins__ així:
Python 3
#__builtins__ has been restricted using None> from> math> import> *> exec> (> 'print(dir())'> , {> '__builtins__'> :> None> }, {> 'sum'> :> sum> ,> 'print'> :> print> ,> 'dir'> :> dir> })> |
>
>Sortida
['dir', 'print', 'sum']>