Exec e variabili globali in Python

di | 18 Novembre 2017

Exec è una funzione built in del Python che permette di eseguire del codice da una stringa.

Prima che vi facciate strane idee non deve servire per eseguire qualsiasi porcata che chiede l’utente, infilarci una rm -rf /* è molto facile.

Nel mio caso tuttavia dovevo eseguire del codice dinamicamente, allocando una variabile a seconda del dato recuperato da un parser.

Ebbene sì, sto creando il mio linguaggio di programmazione, anche se è una semplice evoluzione dei sistemi tipo Programma 101.

Eppure una volta generata la stringa bella bella avevo un risultato del genere:

In 101-ese B>< indica lo scambio tra A e B e B# la stampa di B. Le altre sono variabili di debug.

Ora, non serve Pier Giorgio Perotto per rendersi conto che tutto ciò è profondamente sbagliato.

Ed è sbagliato perché per il Python gli exec sono dei mondi un po’ a sé.

Infatti anche se eseguiti all’interno di una funzione che ha variabili globali le ignorerà allegramente, quindi il B=A salvifico non funziona, perché appena finita la funzione B tornerà al suo valore originale, di default sempre 0.

Come convincere semplicemente exec ad accettare queste variabili? Semplice dandogli come secondo argomento globals().

Ad esempio originariamente il comando era:

exec(opx)

Invece con

exec(opx,globals())

Funziona tutto correttamente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.