[Python] Reload di (parti di) un modulo in ipython

Daniele Varrazzo piro a develer.com
Gio 4 Ott 2012 13:22:00 CEST


On 2012-10-04 12:08, Manlio Perillo wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Il 03/10/2012 22:38, Simone Federici ha scritto:
>> 2012/10/3 Manlio Perillo <manlio.perillo a gmail.com
>> <mailto:manlio.perillo a gmail.com>>
>>
>>     Infatti ho risposto a Daniele che parlava di web server.
>>
>>
>> me tapino :-D
>> avevo frainteso.
>>
>> per tornare al topic iniziale,
>> io il cambio di classe delle istanze lo considero normalissimo,
>> ho codice in produzione che fa le magie
>>
>
> Che sia un pattern normale lo dimostra il fatto che sia supportato 
> anche
> in CLOS (Common Lisp) tramite make-instance-obsolete e
> update-instance-for-redefined-class.
>
> Con CLOS c'è proprio il supporto per gestire il caso di una classe 
> che
> viene ridefinita e tutte le sue instance devono essere aggiornate.

Tanto per continuare l'hack, e sempre col disclaimer che se esistesse 
un'ortodossia in Python questo potrebbe non farne parte: in 
quest'esempio una classe viene ricaricata e tutte le sue istanze 
"corrette" facendole puntare alla nuova classe.

     In [1]: open("testmod.py", "w").write("class C(object):\n def 
f(self):\n  return 10")

     In [3]: import testmod

     In [4]: c = testmod.C()

     In [5]: c.f()
     Out[5]: 10

     In [6]: open("testmod.py", "w").write("class C(object):\n def 
f(self):\n  return 20")

     In [7]: oldcls = testmod.C

     In [8]: reload(testmod)
     Out[8]: <module 'testmod' from 'testmod.py'>

     In [9]: newcls = testmod.C

     In [10]: newcls is oldcls
     Out[10]: False

     In [11]: c.f()
     Out[11]: 10

     In [12]: import gc

     In [14]: id(c)
     Out[14]: 43878544

     In [15]: for o in gc.get_objects():
        ....:     if isinstance(o, oldcls):
        ....:         print id(o)
        ....:         o.__class__ = newcls
        ....:
        ....:
     43878544

     In [16]: c.f()
     Out[16]: 20


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python