logo

exec() v Pythonu

exec() se uporablja za dinamično izvajanje programov Python, ki so lahko niz ali objektna koda. Če je niz, je niz razčlenjen kot zbirka stavkov Python, ki se nato izvede, razen če pride do sintaksne napake, in če je objektna koda, se preprosto izvede. Paziti moramo, da se povratni stavki ne smejo uporabljati zunaj definicij funkcij, niti v kontekstu kode, posredovane funkciji exec(). Ne vrne nobene vrednosti, zato vrne Noben .

Sintaksa Python exec().

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

Parametri:



  • predmet: Kot že rečeno, je to lahko niz ali objektna koda
  • globali: To je lahko slovar in parameter ni obvezen
  • domačini: To je lahko objekt preslikave in je tudi neobvezen

Kako exec() deluje v Pythonu?

V tem primeru lahko vidimo dinamično izvajanje v Pythonu z uporaboexec()>funkcijo. Prikazuje zmožnost dinamičnega izvajanja kode, ki jo vsebuje objekt, in prikazuje koncept dinamičnega izvajanja v Pythonu.

Python3




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

>

>

Izhod

The sum of 5 and 10 is 15>

Opozorilo ali omejitve

Preden uporabite katero koli metodo znotraj funkcije exec(), se morate zavedati, katere vse funkcije podpirajo exec(). Za ogled tega lahko uporabimo funkcijo dir().

V tem primeru lahko vidimo dinamično izvajanje v Pythonu kotdir()>funkcija se izvaja znotrajexec()>funkcijo, ki ponazarja koncept dinamičnega izvajanja v Pythonu.

Python3




ukaz zip v linuxu

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

>

>

Izhod

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

Globalni in lokalni parametri

Python nam omogoča, da omejimo uporabo različnih spremenljivk in metod z uporabo globalnih in lokalnih parametrov, ki morda ne bodo potrebni. Ti lokalni in globalni parametri se uporabljajo za lokalne ali globalne spremenljivke, predvsem slovarje. Parameter global prehiti, če local manjka, kar pomeni, da se lahko global uporablja za obe polji. Poglejmo, kako koda deluje pri posredovanju samo globalnega parametra.

Python3




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

>

>

Izhod

['__builtins__']>

Tako vidimo, da je ob posredovanju praznega slovarja kot globalnega parametra prikazan samo __builtins__ in nobena druga matematična funkcija ni prikazana kot v prejšnjem primeru. To pomeni, da bo za parameter objekta podprt samo __builtins__. To pomeni, da so vse druge funkcije na objektu omejene. Da bi to dokazali, poskusimo delati z matematično funkcijo in poglejmo, kaj se zgodi.

Python3




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

>

>

Ta primer bi moral natisniti 120 kot izhod, vendar namesto tega prikaže Ni izhoda in sproži izjemo. Čeprav smo uvozili matematični modul, metoda factorial() ni delovala zaradi omejitev, ki smo jih nastavili s posredovanjem globalnega parametra.
Dovolimo lahko tudi izvajanje nekaterih od številnih funkcij. Recimo, da želimo, da so vsi drugi matematični moduli omejeni razen funkcije factorial().

Python3




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

>

>

Izhod

120>

Tem vnaprej določenim metodam lahko tudi spremenimo ime in jim med izvajanjem damo uporabniško določeno ime. Ime funkcije lahko spremenimo iz faktoriel() do dejstvo() , ki ga določi uporabnik.

Python3




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

>

>

Izhod

120>

V tem scenariju lahko s podajanjem tako globalnih kot lokalnih parametrov prilagodimo vedenje izvedene kode našim posebnim zahtevam in prikažemo vsestranskost dinamičnega izvajanja v Pythonu.

Python3




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

>

>

Izhod

['iter', 'sum']>

Dinamično izvajanje v Pythonu omogoča izvajanje specifičnih metod, kot nprsum()>initer()>skupaj z vgrajenimi metodami znotrajexec()>funkcijo, ki prikazuje prilagodljivost dinamičnega izvajanja v Pythonu. S tem se lahko znotraj funkcije exec() izvajajo le metode sum in iter skupaj z vsemi vgrajenimi metodami. Uporabo __builtins__ lahko omejimo tudi takole:

Python3




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

>

>

Izhod

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