[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