exec() La funzione viene utilizzata per l'esecuzione dinamica di programmi Python che possono essere una stringa o un codice oggetto. Se è una stringa, la stringa viene analizzata come una suite di istruzioni Python che viene quindi eseguita a meno che non si verifichi un errore di sintassi e se si tratta di un codice oggetto, viene semplicemente eseguita. Dobbiamo fare attenzione che le istruzioni return non possano essere utilizzate al di fuori delle definizioni di funzione, nemmeno nel contesto del codice passato alla funzione exec(). Non restituisce alcun valore, quindi restituisce Nessuno .
Sintassi di Python exec()
exec(oggetto[, globali[, locali]])
parametri:
- oggetto: Come già detto può essere una stringa o un codice oggetto
- globali: Può essere un dizionario e il parametro è facoltativo
- gente del posto: Può essere un oggetto di mappatura ed è anch'esso facoltativo
Come funziona exec() in Python?
In questo esempio, possiamo vedere l'esecuzione dinamica in Python utilizzando il fileexec()>funzione. Dimostra la capacità di eseguire dinamicamente il codice contenuto in un oggetto, mostrando il concetto di esecuzione dinamica in Python.
Python3
prog>=> 'print('The sum of 5 and 10 is', (5+10))'> exec>(prog)> |
>
>Produzione
The sum of 5 and 10 is 15>
Avvertenze o limitazioni
Prima di utilizzare qualsiasi metodo all'interno della funzione exec() è necessario tenere presente cosa supportano tutte le funzioni exec(). Per visualizzarlo possiamo usare la funzione dir().
In questo esempio, possiamo vedere l'esecuzione dinamica in Python comedir()>la funzione viene eseguita all'interno diexec()>funzione, che illustra il concetto di esecuzione dinamica in Python.
Python3
sql seleziona da più tabelle
# The math class is used to include all the> # math functions> from> math>import> *> exec>(>'print(dir())'>)> |
>
>Produzione
['__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 e locali
Python ci consente di limitare l'uso di varie variabili e metodi mediante l'uso di parametri globali e locali, che potrebbero non essere necessari. Questi parametri locali e globali vengono utilizzati per variabili locali o globali, principalmente dizionari. Il parametro globale prevale se manca quello locale, il che significa che globale può essere utilizzato per entrambi i campi. Vediamo come funziona il codice passando solo il parametro globale.
Python3
# Here we have passed an empty dictionary> from> math>import> *> exec>(>'print(dir())'>, {})> |
immagini di ribasso
>
>Produzione
['__builtins__']>
Quindi vediamo che passando un dizionario vuoto come parametro globale, viene visualizzato solo __builtins__ e nessun'altra funzione matematica viene visualizzata come nell'esempio precedente. Ciò significa che solo __builtins__ saranno supportati per il parametro dell'oggetto. Ciò suggerisce che tutte le altre funzioni sono limitate all'oggetto. Per dimostrarlo proviamo a lavorare con una funzione matematica e vediamo cosa succede.
Python3
# An exception will be raised> from> math>import> *> exec>(>'print(factorial(5))'>, {})> |
>
>
Questo esempio avrebbe dovuto stampare 120 come output ma invece visualizza Nessun output e solleva un'eccezione. Sebbene abbiamo importato il modulo matematico, il metodo factorial() non ha funzionato a causa delle restrizioni che abbiamo impostato passando il parametro globale.
Possiamo anche consentire l'esecuzione di alcune delle numerose funzioni. Supponiamo di voler limitare tutti gli altri moduli matematici eccetto la funzione fattoriale().
Python3
# factorial() will be executed> from> math>import> *> exec>(>'print(factorial(5))'>, {>'factorial'>:factorial})> |
>
>Produzione
120>
Possiamo anche cambiare il nome di questi metodi predefiniti e dare loro un nome definito dall'utente durante l'esecuzione. Possiamo cambiare il nome della funzione da fattoriale() A fatto() , che è definito dall'utente.
Python3
# factorial() renamed as fact> from> math>import> *> exec>(>'print(fact(5))'>, {>'fact'>: factorial})> |
>
>Produzione
120>
In questo scenario, passando parametri sia globali che locali, possiamo adattare il comportamento del codice eseguito ai nostri requisiti specifici, dimostrando la versatilità dell'esecuzione dinamica in Python.
Python3
from> math>import> *> exec>(>'print(dir())'>, {>'built'> : __builtins__}, {>'sum'>:>sum>,>'iter'>:>iter>})> |
>
scarica youtube con vlc
>Produzione
['iter', 'sum']>
L'esecuzione dinamica in Python consente l'esecuzione di metodi specifici comesum()>Eiter()>insieme ai metodi integrati all'interno diexec()>funzione, dimostrando la flessibilità dell'esecuzione dinamica in Python. In questo modo, solo i metodi sum e iter insieme a tutti i metodi integrati possono essere eseguiti all'interno della funzione exec(). Possiamo anche limitare l'uso di __builtins__ in questo modo:
Python3
#__builtins__ has been restricted using None> from> math>import> *> exec>(>'print(dir())'>, {>'__builtins__'> :>None>}, {>'sum'>:>sum>,>'print'>:>print>,>'dir'>:>dir>})> |
>
>Produzione
['dir', 'print', 'sum']>