exec() functie wordt gebruikt voor de dynamische uitvoering van Python-programma's die een string- of objectcode kunnen zijn. Als het een string is, wordt de string geparseerd als een reeks Python-instructies die vervolgens worden uitgevoerd, tenzij er een syntaxisfout optreedt. Als het een objectcode is, wordt deze eenvoudigweg uitgevoerd. We moeten ervoor zorgen dat de return-instructies niet buiten de functiedefinities worden gebruikt, zelfs niet binnen de context van code die aan de functie exec() wordt doorgegeven. Het levert geen enkele waarde op en keert dus terug Geen .
Python exec()-syntaxis
exec(object[, globals[, locals]])
Parameters:
- voorwerp: Zoals al gezegd kan dit een string- of objectcode zijn
- globalen: Dit kan een woordenboek zijn en de parameter is optioneel
- lokale bevolking: Dit kan een mappingobject zijn en is ook optioneel
Hoe exec() werkt in Python?
In dit voorbeeld kunnen we dynamische uitvoering in Python zien met behulp van deexec()>functie. Het demonstreert de mogelijkheid om code in een object dynamisch uit te voeren, en toont het concept van dynamische uitvoering in Python.
Python3
hippe taal
prog>=> 'print('The sum of 5 and 10 is', (5+10))'> exec>(prog)> |
>
>Uitvoer
The sum of 5 and 10 is 15>
Waarschuwing of beperkingen
Voordat u methoden binnen de functie exec() gebruikt, moet u in gedachten houden wat alle functies exec() ondersteunen. Om dit te bekijken kunnen we de functie dir() gebruiken.
In dit voorbeeld kunnen we dynamische uitvoering in Python zien als dedir()>functie wordt uitgevoerd binnen deexec()>functie, ter illustratie van het concept van dynamische uitvoering in Python.
Python3
# The math class is used to include all the> # math functions> from> math>import> *> exec>(>'print(dir())'>)> |
>
>Uitvoer
['__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']>
Globale en lokale parameters
Met Python kunnen we het gebruik van verschillende variabelen en methoden beperken door het gebruik van globale en lokale parameters, wat misschien niet nodig is. Deze lokale en globale parameters worden gebruikt voor lokale of globale variabelen, voornamelijk woordenboeken. De globale parameter haalt het over als de local ontbreekt, wat betekent dat global voor beide velden kan worden gebruikt. Laten we eens kijken hoe de code werkt door alleen de globale parameter door te geven.
Python3
# Here we have passed an empty dictionary> from> math>import> *> exec>(>'print(dir())'>, {})> |
Java inschakelen
>
>Uitvoer
['__builtins__']>
We zien dus dat bij het doorgeven van een leeg woordenboek als globale parameter alleen de __builtins__ wordt weergegeven en geen andere wiskundige functies worden weergegeven zoals in het vorige voorbeeld. Dit betekent dat alleen de __builtins__ worden ondersteund voor de objectparameter. Dit suggereert dat alle andere functies beperkt zijn tot het object. Laten we, om dit te bewijzen, proberen met een wiskundige functie te werken en kijken wat er gebeurt.
Python3
volgende scanner
# An exception will be raised> from> math>import> *> exec>(>'print(factorial(5))'>, {})> |
>
>
In dit voorbeeld zou 120 als uitvoer moeten worden afgedrukt, maar in plaats daarvan wordt Geen uitvoer weergegeven en ontstaat er een uitzondering. Hoewel we de wiskundemodule hebben geïmporteerd, werkte de methode factorial() niet vanwege beperkingen die we hebben ingesteld door de globale parameter door te geven.
We kunnen ook enkele van de vele functies laten uitvoeren. Stel dat we willen dat alle andere wiskundemodules worden beperkt, behalve de functie faculteit().
Python3
# factorial() will be executed> from> math>import> *> exec>(>'print(factorial(5))'>, {>'factorial'>:factorial})> |
>
>Uitvoer
120>
We kunnen ook de naam van deze vooraf gedefinieerde methoden wijzigen en ze tijdens de uitvoering een door de gebruiker gedefinieerde naam geven. We kunnen de naam van de functie veranderen van faculteit() naar feit() , dat door de gebruiker is gedefinieerd.
Python3
jpa versus slaapstand
# factorial() renamed as fact> from> math>import> *> exec>(>'print(fact(5))'>, {>'fact'>: factorial})> |
>
>Uitvoer
120>
In dit scenario kunnen we, door zowel globale als lokale parameters door te geven, het gedrag van de uitgevoerde code afstemmen op onze specifieke vereisten, wat de veelzijdigheid van dynamische uitvoering in Python laat zien.
Python3
from> math>import> *> exec>(>'print(dir())'>, {>'built'> : __builtins__}, {>'sum'>:>sum>,>'iter'>:>iter>})> |
theelepel formaat
>
>Uitvoer
['iter', 'sum']>
Dynamische uitvoering in Python maakt de uitvoering van specifieke methoden mogelijk, zoalssum()>Eniter()>samen met ingebouwde methoden in deexec()>functie, die de flexibiliteit van dynamische uitvoering in Python demonstreert. Hierdoor kunnen alleen de som- en iter-methoden samen met alle ingebouwde methoden worden uitgevoerd binnen de exec()-functie. We kunnen het gebruik van __builtins__ ook als volgt beperken:
Python3
#__builtins__ has been restricted using None> from> math>import> *> exec>(>'print(dir())'>, {>'__builtins__'> :>None>}, {>'sum'>:>sum>,>'print'>:>print>,>'dir'>:>dir>})> |
>
>Uitvoer
['dir', 'print', 'sum']>