Reload All
Emmanuel
eastier at free.fr
Thu Apr 22 05:17:20 EDT 2004
Emmanuel a écrit :
> Hi,
>
> I use a 'reload all' feature in my app, that allow to reload every
> module.
>
> I first try this version :
>
> import sys
> def Reload():
> for a in sys.modules.values():
> if ( type(a) == type(sys) ): # I can't remember why
> if ( '__file__' in dir ( a ) ): # to avoid reload of
> extending C module
> try:
> ## print a.__name__
> reload ( a )
> except ImportError:
> Log ("Reload", "error importing module" +
> a.__name__)
>
> but there are some cases where the order of the reload is important.
> I came into this one :
>
> CODE :
> ===============
> Base.py
> ----------
> class Base:
> def __init__(self):
> print "Base Init"
>
> Derived.py
> ------------
> import Base
> class Derived( Base.Base):
> def __init__(self):
> Base.Base.__init__(self)
> print "Derived additional init"
>
> In order to reload all to work, Base _MUST_ be reloaded before Derived.
>
> So I continue with this code, modified from something I get on the forum
> :
> ----------------------------------------------------
> import inspect
>
> def reload_from_root(root):
> if(not inspect.ismodule(root)):
> print 'root is not a module!! Failing.'
> print type(root)
>
> #Keeping lists of pairs where pairs are (parent, child)
> #to establish module relationships and prevent
> #circular reloads
> reload_me = [(None, root)]
> reloaded = []
>
> while(len(reload_me) > 0):
> tmp = reload_me.pop()
>
> for x in inspect.getmembers(tmp[1]):
> if(inspect.ismodule(x[1])):
> if ( '__file__' in dir ( x[1] ) ):
> if((tmp[1], getattr(tmp[1], x[0])) not in reloaded):
> reload_me.append((tmp[1], getattr(tmp[1], x[0])))
>
> ## reload(tmp[1]) # If I use reload here, the child is
> always reloaded before the parent
> reloaded.append((tmp[0], tmp[1]))
>
> reloaded.reverse()
> TheReloaded = []
> for pair in reloaded:
> if (pair[1] not in TheReloaded ): # Don't reload twice
> the Base, else it can reload in this order :
> # Base -
> Derived1 - Base- Derived2
> # and
> Derived1 init will fails
> reload (pair[1])
> TheReloaded.append( pair[1])
> ----------------------------------------------------
>
> This code solves my current problems, but I can imagine some possible
> issue with two levels hierarchies.
euh... Can I ???
More information about the Python-list
mailing list