[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