[Python] With... as... per sopprimere NameError
Manlio Perillo
manlio.perillo a gmail.com
Mar 14 Maggio 2013 19:34:19 CEST
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
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
Ma vedilo come curiosità accademica; io non userei una cosa del genere
in del codice "reale".
Ecco un esempio di utilizzo (supponendo che il codice sia salvato in un
modulo slots.py:
## BEGIN CODE ##
from slots import slots
def test():
a = 'local original'
datum = {
'a': 'local modified',
'b': 'global modified',
'c': 'global added'
}
with slots(datum):
print 'in slots...'
print a
print b
print c
print 'outside slots...'
print a
print b
print c
b = 'global original'
test()
## END CODE ##
Eseguendolo, stampa:
## BEGIN SHELL ##
in slots...
local modified
global modified
global added
outside slots...
local original
global original
Traceback (most recent call last):
File "slots_example.py", line 25, in <module>
test()
File "slots_example.py", line 21, in test
print c
NameError: global name 'c' is not defined
## END SHELL ##
Ciao Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAlGSdZsACgkQscQJ24LbaUQhigCfUZUVwTGVljTunRPA4U+Gh0O0
GgIAoI2FhcPZrOjJiO4rRl8dFGuEfmCi
=59f5
-----END PGP SIGNATURE-----
Maggiori informazioni sulla lista
Python