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

Pietro Battiston me a pietrobattiston.it
Mar 14 Maggio 2013 22:24:29 CEST


Il giorno mar, 14/05/2013 alle 19.34 +0200, Manlio Perillo ha scritto:
> Il 14/05/2013 17:37, Manlio Perillo ha scritto:
> > [...]
> > 
> > Con Python credo tu possa al massimo ottenere, abbastanza facilmente,
> > qualcosa come:
> > 
> > with obj.context(condizione) as d:
> >     d.x + d.y
> > 
> > Non è possibile "iniettare" delle variabili locali.
> > 
> 
> Dato che era un problema interessante, mi sono documentato meglio.
> Usando un API specifica di CPython sembra sia possibile fare quello che
> chiedi:
> http://pastebin.com/pc5i4V1u
> 

Sono estasiato.

Che ci sia davvero sotto un sortilegio me lo ha dimostrato la seguente
cosa: ho provato a modificare il tuo codice in modo che le variabili di
"datum" venissero memorizzate come locali, invece che globali (sì,
confesso che è ipocrita fare il raffinato su un tale hack), e ne ho
avuto il seguente simpatico comportamento, nella parte "in slots...":

    print "c" in locals() # Stampa "True"
    print c               # "NameError: global name 'c' is not defined"!

Non pago, ho provato ad investigare con un "import ipdb;
ipdb.set_trace()" prima di queste due righe... e con ipdb, il NameError
scompare!

Credo che mi ci vorrà un po' a capire veramente cosa sta succedendo...

> Ma vedilo come curiosità accademica; io non userei una cosa del genere
> in del codice "reale".
> 

Non posso giurarti che resisterò...
(ma perlomeno puoi stare tranquillo che il progetto pandas non mi
accetterebbe mai del codice del genere!)

ciao, grazie

Pietro



Maggiori informazioni sulla lista Python