[Python] With... as... per sopprimere NameError

Pietro Battiston me a pietrobattiston.it
Mar 14 Maggio 2013 13:32:40 CEST


Salve a tutti,

sto usando con ragionevole soddisfazione del codice di questo tipo:¹

class TuDimmiCosaVuoiCheCiPensoIo():
    def __init__(self, d):
        self._d = d
        self._pres = {}
    def __enter__(self):
        for key in self._d:
            if key in globals():
                self._pres[key] = globals()[key]
        globals()[key] = self._d[key]
    def __exit__(self, type, value, traceback):
        for key in self._d:
            if key in self._pres and globals()[key] == self._d[key]:
                # Not changed - restore:
                globals()[key] = self._pres[key]

a = "non ti sto mica salutando"

print a
with TuDimmiCosaVuoiCheCiPensoIo( {"a" : "ciao"} ):
    print a

print a



La soddisfazione sarebbe sterminata se non fosse che questo codice,
giocando con "globals()", non funziona dall'interno di una funzione.
Inoltre, mi piacerebbe (ma è secondario) che l'oggetto da associare ad
un certo nome fosse generabile dinamicamente.

Da quel che ho letto in giro, sospetto che i più esperti di voi stiano
già aggrottando le sopracciglia ("non crederai mica di modificare
locals(), ragazzino?!"), però ecco, magari avete qualche idea che a me
non passerebbe neanche per la mente (N.B: mi è passato per la mente
"eval("...")" al posto di "with...", e non mi piace).

Avevo anche pensato che __enter__ potrebbe installare un sys.excepthook
modificato che cattura le NameErrorException (e __exit__ ripristinare
quello originale)... ma un conto è catturarle, un altro fornirle al
codice l'oggetto relativo e farlo proseguire normalmente...

grazie per qualsiasi consiglio.

Pietro

¹ Per chi si stesse preoccupando per la mia mente malata: voglio potere
scrivere codice che lavora sulle colonne di pandas.DataFrame riferendomi
direttamente alle colonne con il loro nome, e magari stabilendo un
filtering su una condizione prefissata, semplificando _enormemente_ il
codice delle analisi econometriche che sviluppo con pandas/statsmodels.



Maggiori informazioni sulla lista Python