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

Pietro Battiston me a pietrobattiston.it
Mar 14 Maggio 2013 16:37:25 CEST


Il giorno mar, 14/05/2013 alle 15.05 +0200, Manlio Perillo ha scritto:
> Il 14/05/2013 14:27, Pietro Battiston ha scritto:
> > [...]
> > 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...)
> > 
> 
> Cosa usano: Common Lisp?

No, cose come R, STATA, Gretl (o meglio Hansl, il suo linguaggio di
programmazione)... linguaggi che vanno (alcuni più, altri meno) bene per
l'analisi statistica, e con cui poi impazzisci quando cerchi di fare
qualsiasi altra cosa (discorso leggermente meno vero per R).

A scanso di equivoci: non sto dicendo che siano linguaggi che consentono
una gerarchia di scoping manipolabili; sono semplicemente linguaggi in
cui le variabili _sono_ colonne di un dataframe, che è unico ed
implicito. Insomma, come se io mi prendessi il codice python e ci
facessi un grosso "eval" mettendo nei locals quello che mi pare... solo
che, appunto, vorrei evitare (per non perdere l'evidenziazione della
sintassi in un editor di testo... e per non dovermi vergognare ancora di
più a mostrare il mio codice in giro!!).


> Common Lisp con la macro with-slots di CLOS è l'unica soluzione più
> espressiva che mi viene in mente, per quello che vuoi fare.

Potrei sbagliarmi, ma mi pare che "exec()" in Python 3 faccia
esattamente tutto ciò...

... peccato che ovviamente come soluzione faccia schifo (sempre per il
solito problemino - i delimitatori di scope sarebbero i delimitatori di
stringhe). Però dal punto di vista concettuale, se passi come secondo
argomento ad "exec()" una sorta di dizionario che quando non ha una key
la cerca prima nel (suo) locals() e poi nel (suo) globals(), non vedo la
differenza...


> E'
> addirittura possibile assegnare gli attributi/slots, e non solo leggere
> come vuoi fare tu.
> 

... ah, a me piacerebbe anche assegnare eh... ma diciamo che è di
importanza secondaria.


> Quello che vuoi fare credo non sia possibile in Python, e francamente
> non vedo in che modo aumenti l'espressività..
> 

Ignoro se ci sia una definizione univoca di espressività, quindi non
sono certo di quale sia la tua risposta al tuo dubbio. Di certo
ridurrerebbe enormemente la quantità di codice che è necessario scrivere
per fare una qualsiasi analisi econometrica (se guardo quella che sto
facendo ora, credo che sarebbe di un fattore 2, per non parlare della
maggiore semplicità di manutenzione).

Nota che stiamo parlando di un'applicazione pseudo-scripting (al limite
un comando solo, magari monouso), non di applicazioni in cui "basterebbe
ristrutturare un attimo il codice per risolvere il problema".

ciao

Pietro



Maggiori informazioni sulla lista Python