Per eseguire di­ret­ta­men­te singole righe di codice o un blocco di codice e me­mo­riz­zar­ne il risultato in una variabile è possibile uti­liz­za­re la funzione compile in Python. La funzione re­sti­tui­sce un oggetto di codice ese­gui­bi­le.

Pos­si­bi­li­tà di ap­pli­ca­zio­ne

Se de­si­de­ra­te eseguire singole istru­zio­ni di codice non di­ret­ta­men­te nel vostro programma in Python, ma sem­pli­ce­men­te as­se­gnar­le a una variabile, è possibile uti­liz­za­re la funzione compile. Questa funzione serve a con­ver­ti­re il codice sorgente in codice oggetto e re­sti­tui­sce un oggetto ese­gui­bi­le suc­ces­si­va­men­te per mezzo della funzione exec in Python. A questa è anche possibile as­se­gnar­vi un file dal quale estrarre il codice sorgente.

Consiglio

Uti­liz­za­te Python per rea­liz­za­re il vostro progetto web con un lin­guag­gio di pro­gram­ma­zio­ne ef­fi­cien­te? Allora Deploy Now di IONOS vi aiuterà a lavorare con ancora maggiore ef­fi­cien­za grazie alla pos­si­bi­li­tà di ef­fet­tua­re il de­ploy­ment del vostro sito web tramite GitHub quando più lo de­si­de­ra­te. L’anteprima in tempo reale permette di vi­sua­liz­za­re lo stato ag­gior­na­to del vostro progetto in ogni momento con pochi semplici clic.

La sintassi di Python compile

È possibile eseguire la funzione compile in Python con un massimo di sei parametri diversi; solo i primi tre parametri sono ob­bli­ga­to­ri. I restanti parametri della funzione sono opzionali e uti­liz­za­bi­li a piacere per spe­ci­fi­ca­re il com­por­ta­men­to della funzione.

compile(source, filename, mode, flags = 0, dont_inherit = False, optimize = -1)
python

Per com­pren­de­re meglio la funzione compile è utile avere una visione d’insieme dei singoli parametri.

Parametro Opzionale De­scri­zio­ne
source no Serve a passare l’oggetto che de­si­de­ra­te compilare. Nella maggior parte dei casi si tratta di stringhe, ma è possibile passare anche oggetti byte oppure oggetti AST.
filename no Serve a indicare il file sorgente dell’oggetto da compilare. In mancanza di un file, è possibile scrivere ciò che de­si­de­ra­te. Il parametro è comunque ob­bli­ga­to­rio.
mode no Il parametro mode permette di spe­ci­fi­ca­re come deve avvenire la com­pi­la­zio­ne. A vostra di­spo­si­zio­ne avete i seguenti valori:
  • eval: per valutare singole espres­sio­ni.
  • exec: per valutare blocchi di codice.
  • single: per istru­zio­ni singole e in­te­rat­ti­ve.
flags Permette di indicare l’esatta modalità di com­pi­la­zio­ne della sorgente. Nella mag­gio­ran­za dei casi ap­pli­ca­ti­vi è comunque possibile ignorare i flag.
dont_inherit Esat­ta­men­te come per flag, il parametro dont_inherit serve a spe­ci­fi­ca­re la com­pi­la­zio­ne della vostra sorgente.
optimize Nel parametro optimize è possibile de­ter­mi­na­re il livello di ot­ti­miz­za­zio­ne del vostro processo di com­pi­la­zio­ne.

Utilizzo di Python compile

Un esempio di codice è utile per chiarire il fun­zio­na­men­to di compile in Python:

codeAsString = 'x = 10\ny = 7\nres = x * y\nprint("result = ", res)'
codeObject = compile(codeAsString, ' ', 'exec')
exec(codeObject)
python

Per prima cosa, definite la variabile di nome co­deAs­String, che conterrà il seguente semplice codice Python sotto forma di stringa in Python:

x = 10
y = 7
res = x * y
print("result = ", res)
python

Non fatevi con­fon­de­re dalle “\n” nella stringa co­deAs­String: sono caratteri di controllo per con­tras­se­gna­re un’in­ter­ru­zio­ne di riga. Come vedete, è possibile me­mo­riz­za­re fa­cil­men­te il vostro codice Python sotto forma di serie di caratteri in una variabile con­ven­zio­na­le. A questo punto, è ne­ces­sa­ria la funzione compile per in­ter­pre­ta­re il codice non soltanto come una semplice catena di caratteri. L’ese­cu­zio­ne della funzione compile nell’esempio pre­ce­den­te utilizza solo i parametri necessari.

Per iniziare, indicate l’oggetto da compilare, ossia la vostra stringa. Suc­ces­si­va­men­te spe­ci­fi­ca­te il file sorgente della vostra stringa. Poiché la stringa è stata definita di­ret­ta­men­te nel codice e non caricata da un file, è suf­fi­cien­te indicare la catena di caratteri vuota. In teoria è comunque possibile uti­liz­za­re una qualsiasi catena di caratteri di vostra scelta.

Anche l’ultimo parametro è in­te­res­san­te: poiché la nostra stringa co­deAs­String è un blocco di codice intero, come mostra la ri­so­lu­zio­ne della stringa nel secondo esempio di codice, uti­liz­zia­mo il parametro exec. Ricordate che si tratta di una stringa e non di­men­ti­ca­te le vir­go­let­te.

Il risultato della funzione Python compile per l’esempio di codice pre­ce­den­te è assegnato alla variabile di nome co­deO­b­jekt. Il nome della variabile svela il suo contenuto: un oggetto di codice. La par­ti­co­la­ri­tà di un oggetto di codice è la pos­si­bi­li­tà di eseguirlo in qualsiasi momento ri­chia­man­do la funzione exec in Python: esat­ta­men­te ciò che succede nell’ultima riga di codice, grazie alla quale il programma re­sti­tui­sce “result = 70” come risultato finale.

Com­pi­la­zio­ne di una singola istru­zio­ne

Se de­si­de­ra­te compilare soltanto una singola istru­zio­ne di codice, è ne­ces­sa­rio mo­di­fi­ca­re il terzo parametro di ese­cu­zio­ne della funzione Python compile. Il motivo è l’utilizzo della modalità eval per istru­zio­ni singole. Anche in questo caso è utile un esempio:

singleInstruction = 'print("Hello World!")'
codeObject = compile(singleInstruction, ' ', 'eval')
exec(codeObject)
python

In generale, non ci sono molte dif­fe­ren­ze. Il risultato è sempre una stringa con codice Python. A dif­fe­ren­za dell’esempio pre­ce­den­te, però, in questo caso la stringa contiene solo una singola istru­zio­ne print in Python. Pertanto, è ne­ces­sa­rio uti­liz­za­re la modalità eval, che serve a valutare singole istru­zio­ni.

Eseguendo nuo­va­men­te il vostro oggetto di codice per mezzo della funzione exec, noterete che tutto funziona come previsto. Il vostro programma mostrerà la scritta “Hello World!” sullo schermo.

Ela­bo­ra­zio­ne di codice sorgente da file sorgente

Negli esempi pre­ce­den­ti abbiamo sempre definito il codice sorgente, da elaborare tramite la funzione Python compile, sotto forma di stringa nel programma stesso. Ma come fare per uti­liz­za­re ed eseguire nel vostro programma il codice contenuto in un file? Anche in questo caso è possibile uti­liz­za­re la funzione Python compile.

Ipo­tiz­zia­mo di avere un file di nome testcode.py con­te­nen­te un codice Python ese­gui­bi­le e di volerlo eseguire nel vostro programma:

tmpFile = open('testcode.py', 'r')
tmpCode = tmpFile.read()
tmpFile.close()
codeObject = compile(tmpCode, 'testcode.py', 'exec')
exec(codeObject)
python

Prima è ne­ces­sa­rio leggere il codice che de­si­de­ra­te eseguire dal file in cui si trova at­tual­men­te. A tal fine, aprite il file con la funzione Python open e con accesso in lettura. Suc­ces­si­va­men­te è possibile uti­liz­za­re la funzione Python read per caricare il codice sorgente nella vostra variabile di nome tmpCode e chiudere nuo­va­men­te il file aperto all’inizio.

Quindi ri­chia­ma­te la funzione Python compile. A questo punto è im­por­tan­te indicare da dove proviene il codice che de­si­de­ra­te compilare; in questo caso, dal file testcode.py. Suc­ces­si­va­men­te il programma si svolge in modo simile agli esempi pre­ce­den­ti; ri­chia­man­do quindi la funzione exec potete infine eseguire il codice caricato dal file testcode.py nel vostro programma.

Vai al menu prin­ci­pa­le