exec() Funkce se používá pro dynamické spouštění programů Python, což může být buď řetězec nebo objektový kód. Pokud se jedná o řetězec, je řetězec analyzován jako sada příkazů Pythonu, která se pak provede, pokud nenastane syntaktická chyba, a pokud se jedná o objektový kód, jednoduše se provede. Musíme být opatrní, že příkazy return nelze použít mimo definice funkcí ani v kontextu kódu předávaného funkci exec(). Nevrací žádnou hodnotu, tedy vrací Žádný .
Syntaxe Pythonu exec().
exec(object[, globals[, locals]])
Parametry:
- objekt: Jak již bylo řečeno, může to být řetězec nebo objektový kód
- globální: Může to být slovník a parametr je volitelný
- místní obyvatelé: Může to být objekt mapování a je také volitelný
Jak exec() funguje v Pythonu?
V tomto příkladu můžeme vidět dynamické provádění v Pythonu pomocíexec()>funkce. Ukazuje schopnost dynamicky spouštět kód obsažený v objektu a předvádí koncept dynamického spouštění v Pythonu.
Python3
prog>=> 'print('The sum of 5 and 10 is', (5+10))'> exec>(prog)> |
string split java
>
>Výstup
The sum of 5 and 10 is 15>
Upozornění nebo omezení
Před použitím jakékoli metody uvnitř funkce exec() je třeba mít na paměti, co všechny funkce exec() podporují. K zobrazení tohoto můžeme použít funkci dir().
V tomto příkladu můžeme vidět dynamické provádění v Pythonu jakodir()>funkce se provádí v rámciexec()>funkce, ilustrující koncept dynamického provádění v Pythonu.
Python3
# The math class is used to include all the> # math functions> from> math>import> *> exec>(>'print(dir())'>)> |
>
>Výstup
['__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']>
Globální a místní parametry
Python nám umožňuje omezit použití různých proměnných a metod pomocí globálních a lokálních parametrů, které nemusí být potřeba. Tyto lokální a globální parametry se používají pro lokální nebo globální proměnné, zejména slovníky. Globální parametr má přednost, pokud chybí lokální, což znamená, že globální lze použít pro obě pole. Podívejme se, jak kód funguje na předávání pouze globálního parametru.
Python3
# Here we have passed an empty dictionary> from> math>import> *> exec>(>'print(dir())'>, {})> |
ddl vs dml
>
>Výstup
['__builtins__']>
Vidíme tedy, že při předání prázdného slovníku jako globálního parametru se zobrazí pouze __builtins__ a žádné další matematické funkce jako v předchozím příkladu. To znamená, že pro parametr objektu budou podporovány pouze __builtins__. To naznačuje, že všechny ostatní funkce jsou na objektu omezeny. Abychom to dokázali, zkusme pracovat s matematickou funkcí a uvidíme, co se stane.
Python3
# An exception will be raised> from> math>import> *> exec>(>'print(factorial(5))'>, {})> |
>
jarní inicializr
>
Tento příklad by měl mít vytištěno 120 jako výstup, ale místo toho zobrazí Žádný výstup a vyvolá výjimku. Ačkoli jsme importovali matematický modul, metoda factorial() nefungovala kvůli omezením, která jsme nastavili předáním globálního parametru.
Můžeme také povolit provedení několika z mnoha funkcí. Předpokládejme, že chceme, aby všechny ostatní matematické moduly byly omezeny kromě funkce factorial().
Python3
# factorial() will be executed> from> math>import> *> exec>(>'print(factorial(5))'>, {>'factorial'>:factorial})> |
>
>Výstup
120>
Můžeme také změnit název těchto předdefinovaných metod a dát jim uživatelsky definovaný název během provádění. Název funkce můžeme změnit z faktoriál() na skutečnost() , který je definován uživatelem.
Python3
# factorial() renamed as fact> from> math>import> *> exec>(>'print(fact(5))'>, {>'fact'>: factorial})> |
algoritmy binární vyhledávání
>
>Výstup
120>
V tomto scénáři předáním globálních i lokálních parametrů můžeme přizpůsobit chování prováděného kódu našim konkrétním požadavkům a předvést tak všestrannost dynamického spouštění v Pythonu.
Python3
from> math>import> *> exec>(>'print(dir())'>, {>'built'> : __builtins__}, {>'sum'>:>sum>,>'iter'>:>iter>})> |
>
>Výstup
['iter', 'sum']>
Dynamické provádění v Pythonu umožňuje provádění specifických metod jako napřsum()>aiter()>spolu s vestavěnými metodami uvnitřexec()>funkce demonstrující flexibilitu dynamického provádění v Pythonu. Díky tomu lze ve funkci exec() provádět pouze metody sum a iter spolu se všemi vestavěnými metodami. Můžeme také omezit použití __builtins__ takto:
Python3
mikrolitické jádro
#__builtins__ has been restricted using None> from> math>import> *> exec>(>'print(dir())'>, {>'__builtins__'> :>None>}, {>'sum'>:>sum>,>'print'>:>print>,>'dir'>:>dir>})> |
>
>Výstup
['dir', 'print', 'sum']>