English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Corso di base Python

Controllo dei flussi Python

Funzione in Python

Tipi di dati in Python

Operazioni di file Python

Oggetti e classi Python

Data e ora Python

Conoscenze avanzate di Python

Manuale di riferimento di Python

Utilizzo e esempio di Python exec()

Funzioni native di Python

Il metodo exec() di Python esegue programmi creati dinamicamente, che possono essere stringhe o oggetti codice.

Sintassi di exec()

exec(object, globals, locals)

Parametri di exec()

exec() accetta tre parametri:

  • Oggetto - Stringa o oggetto codice

  • globals Opzionale) - Dizionario

  • localsOpzionale) - Oggetto mappatura. La mappa è un tipo di mappatura standard utilizzato frequentemente in Python.

Verranno discussi in questo articolo.Variabili globali(globals) e (locals)LocaleVariabileUso.

Valore restituito da exec()

exec() non restituisce alcun valore, restituisce None.

Esempio 1: Come funziona exec()?

program = 'a = 5\nb=10\nprint("Somma =", a+b)'
exec(program)

Quando si esegue il programma, l'output è:

Somma = 15

Qui, l'oggetto stringa program viene passato a exec() per eseguire il programma. In questo esempio sono stati omessi i variabili globali(globals) e (locals)Variabile locale.

Esempio 2: Consente all'utente di fornire input

program = input('Inserisci il programma:')
exec(program)

Quando si esegue il programma, l'output è:

Programma di input: [print(item) for item in [1, 2, 3]]
1
2
3

Se devi ottenere codice Python da un utente che può inserire codice a multilinea (usando '\n'), puoi utilizzare il metodo compile() prima di exec().

Conosci qualcosa suMetodo compile() in PythonPiù informazioni.

Sii cauto nell'uso di exec()

Considera un caso in cui stai utilizzando un sistema Unix (macOS, Linux, ecc.) e hai importato il modulo os. Il modulo os fornisce un metodo portatile per utilizzare le funzionalità del sistema operativo, ad esempio: leggere o scrivere file.

Se si permette all'utente di utilizzare exec(input()) per inserire valori, l'utente può emettere comandi per modificare i file, persino utilizzare command per eliminare tutti i file os.system('rm -rf *').

Se si utilizza exec(input()) nel codice, è meglio controllare quali variabili e metodi possono essere utilizzati dall'utente. Puoi usareMetodo dir()Visualizza le variabili e i metodi disponibili.

from math import *
exec('print(dir())')

Quando si esegue il programma, l'output è:

['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__name__', '_dh', '_i', '_i1', '_i2', '_ih', '_ii', '_iii', '_oh', '_sh', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exit', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'get_ipython', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'quit', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

dei metodi e delle variabili disponibili in exec()

Di solito, non è necessario utilizzare tutti i metodi e le variabili disponibili in exec(), potrebbe anche esserci una falla di sicurezza. Puoi limitare l'uso opzionaleglobalselocalsparametro (dizionario) viene passato al metodo exec() per limitare l'uso di queste variabili e metodi.

1. Vengono omessi entrambi i parametri globali (globals) e locali (locals)

Se entrambi i parametri vengono omessi (come nel nostro esempio precedente), exec() si aspetta di eseguire il codice nella portata corrente. Puoi usare il seguente codice per controllare le variabili e i metodi disponibili:

exec('print(dir())')

passare il parametro globale; omettere il parametro locals

(globals) e (locals)parametro(dizionario), rispettivamente per variabili globali e locali. Se si omettelocalsIl dizionario, se non specificato, di default èglobalsQuesto significa cheVariabili globali (globals)verranno utilizzati per variabili globali e locali.

Attenzione:Puoi usarli rispettivamenteglobals()elocals()I metodi built-in in Python controllano il dizionario globale e il dizionario locale corrente.

Passare un dizionario vuoto come parametro globale

from math import *
exec('print(dir())', {})
# Questo codice genererà un'eccezione
# exec('print(sqrt(9))', {})

Se si passa un dizionario vuoto comeglobalsSe non viene trasmesso, è disponibile solo __builtins__ per l'oggetto (il primo argomento di exec()). Anche se abbiamo importato il modulo math nel programma sopra, cercare di accederemodulo mathOgni funzione fornita può causare un'eccezione.

Quando si esegue il programma, l'output è:

['__builtins__']

Fornisce alcuni metodi disponibili

from math import *
exec('print(dir())', {'sqrt': sqrt, 'pow': pow})
# L'oggetto può avere il modulo sqrt()
exec('print(sqrt(9))', {'sqrt': sqrt, 'pow': pow})

Qui, il codice eseguito da exec() può avere anche i metodi sqrt() e pow() e __builtins__.

Puoi modificare il nome del metodo a tuo piacimento.

from math import *
exec('print(dir())', {'squareRoot': sqrt, 'pow': pow})
# L'oggetto può avere il modulo squareRoot()
exec('print(squareRoot(9))', {'squareRoot': sqrt, 'pow': pow})

Nel programma sopra, la funzione squareRoot() calcola la radice quadrata (funzioni simili come sqrt()). Ma l'uso di sqrt() provocherà un'eccezione.

Limitare l'uso di funzioni native

Puoi limitare l'uso di __builtins__ assegnando None al dizionario globals per __builtins__.

exec(object, {'__builtins__': None})

3. Attraverso dizionari globali e locali

Puoi passareLocaleUtilizzando il dizionario (locals) per rendere disponibili le funzioni e le variabili necessarie. Ad esempio:

from math import *
globalsParameter = {'__builtins__': None}
localsParameter = {'print': print, 'dir': dir}
exec('print(dir())', globalsParameter, localsParameter)

Quando si esegue il programma, l'output è:

['dir', 'print']

In questo caso, il metodo exec() può eseguire solo due metodi nativiprint()edir().

Occorre prestare particolare attenzione perché exec() esegue codice e non restituisce alcun valore (restituisce None). Pertanto, non è possibile utilizzare return al di fuori della definizione della funzione eyieldenunciato.

Funzioni native di Python