[Python] With... as... per sopprimere NameError
Manlio Perillo
manlio.perillo a gmail.com
Mar 14 Maggio 2013 22:39:25 CEST
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Il 14/05/2013 22:24, Pietro Battiston ha scritto:
> [...]
>> 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"!
>
Questo succede perchè Python decide se una variabile è locale o globale
quando il codice viene compilato. Quindi, come ti avevo già detto, non
è possibile definire nuove variabili locali a run-time. Nel tuo caso,
la variabile c è nel dizionario locals, ma non è nell'array interno
usato da CPython per il lookup delle variabili locali.
Però, in teoria, non ci sono ragioni per cui non debba essere possibile
modificare le variabili locali esistenti (ad esempio, un debugger serio
deve permettere di farlo); l'unico problema è che l'aggiornamento di
locals() non garantisce quello che vogliamo, questo per permettere di
ottimizzare l'accesso alle variabili locali.
> Non pago, ho provato ad investigare con un "import ipdb;
> ipdb.set_trace()" prima di queste due righe... e con ipdb, il NameError
> scompare!
>
E cosa ottieni?
Con pdb (il debugger standard), viene sempre lanciata l'eccezione.
> 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!)
>
Mai sopravvalutare le persone... ;-)
> ciao, grazie
>
Grazie a te, perchè ho capito meglio un aspetto di Python che non
conoscevo molto bene.
Ciao Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAlGSoPwACgkQscQJ24LbaUTfzQCfYIb7tu31IzozxHfNBKb5SEVA
SGYAni5pCvKPGJew2oJmFw6ea316WUNd
=fWrw
-----END PGP SIGNATURE-----
Maggiori informazioni sulla lista
Python