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

Pietro Battiston me a pietrobattiston.it
Mar 14 Maggio 2013 14:27:19 CEST


Il giorno mar, 14/05/2013 alle 13.52 +0200, Marco Giusti ha scritto:
> On Tue, May 14, 2013 at 01:32:40PM +0200, Pietro Battiston wrote:
> > 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...
> 
> premetto che non mi è chiarissimo perché tu voglia installare
> sys.excepthook, ma un context manager può gestire solo il codice
> all'interno del contesto stesso:
> 
> 	with context(..):
> 		do_stuff()  # <- questo e' gestito
> 	do_stuff_again()  # <- questo no, se NameError e' generata, __exit__
> 	                  # non può fare niente
> 

Ma è esattamente quello che voglio! L'esempio che ho scritto io se
eseguito _fa_ esattamente quello che voglio... il problema è che non
funziona se utilizzato invece in una funzione.

N.B: sì, NameError, non NameErrorException, sorry.


> però se NameError, e non NameErrorException, è generato all'interno del
> contesto, tu nell'__exit__ puoi sopprimere l'eccezione, basta ritornare
> un valore che sia valutato logicamente vero:
> 
> 	def __exit__(self, exc_type, exc_value, traceback):
> 		if isinstance(exc_type, NameError):
> 			return True
> 		# di default ritorna None che è valutato falso e l'eccezione e'
> 		# propagata
> 


Eh, ma io non voglio semplicemente che l'eccezione sia soppressa, ovvero
che "print a" venga semplicemente saltato; bensì che "a" diventi quel
che voglio io (e quindi in questo caso particolare venga stampato)...


> 
> > ¹ 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.
> 
> non saprei non conosco pandas. se posti del codice come è ora e come
> vorresti che sia forse qualche aiuto in più posso dartelo

Allora: supponi che ci sia "df", un oggetto Dataframe, che contiene
varie colonne (=variabili). Ora, supponi che "df" contenga una colonna
"x" e una "y". Al momento per averne la somma devo fare

df["x"] + df["y"]

io voglio poter fare semplicemente

x + y

all'interno di un dato contesto ("with df.my_context(): ...").


(Finché non riesco a fare una cosa del genere, mi vergogno a mostrare il
mio codice econometrico in Python ai miei colleghi, che utilizzano
linguaggi più brutti ma ad hoc e quindi enormemente meno verbosi...)

ciao

Pietro



Maggiori informazioni sulla lista Python