logo

exec() în Python

exec() funcția este utilizată pentru execuția dinamică a programelor Python, care poate fi fie un șir, fie un cod obiect. Dacă este un șir, șirul este analizat ca o suită de instrucțiuni Python care este apoi executată, cu excepția cazului în care apare o eroare de sintaxă și dacă este un cod obiect, este pur și simplu executat. Trebuie să avem grijă ca instrucțiunile return să nu fie folosite în afara definițiilor funcției, nici măcar în contextul codului transmis funcției exec(). Nu returnează nicio valoare, deci se întoarce Nici unul .

Sintaxa Python exec().

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



actualizare din join sql

Parametri:

  • obiect: După cum sa spus deja, acesta poate fi un șir sau un cod obiect
  • globale: Acesta poate fi un dicționar, iar parametrul este opțional
  • localnici: Acesta poate fi un obiect de cartografiere și este, de asemenea, opțional

Cum funcționează exec() în Python?

În acest exemplu, putem vedea execuția dinamică în Python folosindexec()>funcţie. Demonstrează capacitatea de a executa codul conținut într-un obiect în mod dinamic, prezentând conceptul de execuție dinamică în Python.

Python3








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

>

>

Ieșire

The sum of 5 and 10 is 15>

Avertisment sau limitări

Înainte de a utiliza orice metodă în interiorul funcției exec() trebuie să țineți cont de ceea ce suportă toate funcțiile exec(). Pentru a vizualiza acest lucru, putem folosi funcția dir().

În acest exemplu, putem vedea execuția dinamică în Python cadir()>funcția este executată în cadrulexec()>funcția, ilustrând conceptul de execuție dinamică în Python.

Python3




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

>

>

Ieșire

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

Parametri globali și locali

Python ne permite să restricționăm utilizarea diferitelor variabile și metode prin utilizarea parametrilor globali și locali, care ar putea să nu fie necesari. Acești parametri locali și globali sunt utilizați pentru variabilele locale sau globale, în principal dicționare. Parametrul global depășește dacă localul lipsește, ceea ce înseamnă că global poate fi utilizat pentru ambele câmpuri. Să vedem cum funcționează codul la trecerea doar a parametrului global.

Python3




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

>

>

Ieșire

['__builtins__']>

Deci vedem că la trecerea unui dicționar gol ca parametru global, sunt afișate doar __builtins__ și nu sunt afișate alte funcții matematice ca în exemplul anterior. Aceasta înseamnă că numai __builtins__ vor fi acceptate pentru parametrul obiect. Acest lucru sugerează că toate celelalte funcții sunt limitate la obiect. Pentru a demonstra asta, să încercăm să lucrăm cu o funcție matematică și să vedem ce se întâmplă.

Python3




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

>

>

Acest exemplu ar trebui să fi tipărit 120 ca ieșire, dar, în schimb, afișează No Output și ridică o excepție. Deși, am importat modulul matematic, metoda factorial() nu a reușit să funcționeze din cauza restricțiilor pe care le-am stabilit prin trecerea parametrului global.
De asemenea, putem permite executarea câtorva dintre numeroasele funcții. Să presupunem că vrem ca toate celelalte module matematice să fie restricționate, cu excepția funcției factorial().

Python3




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

>

>

Ieșire

120>

De asemenea, putem schimba numele acestor metode predefinite și le putem da un nume definit de utilizator în timpul execuției. Putem schimba numele funcției din factorial() la fapt() , care este definit de utilizator.

Python3

permanent




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

>

>

Ieșire

120>

În acest scenariu, prin trecerea parametrilor globali și locali, putem adapta comportamentul codului executat la cerințele noastre specifice, arătând versatilitatea execuției dinamice în Python.

Python3




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

>

>

Ieșire

['iter', 'sum']>

Execuția dinamică în Python permite executarea unor metode specifice, cum ar fisum()>șiiter()>împreună cu metodele încorporate în interiorulexec()>funcție, demonstrând flexibilitatea execuției dinamice în Python. Prin aceasta, numai metodele sum și iter împreună cu toate metodele încorporate pot fi executate în cadrul funcției exec(). De asemenea, putem restricționa utilizarea __builtins__ astfel:

Python3




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

>

>

Ieșire

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