File: LP6E/Chapter25/reloadall3.py
"""
reloadall3.py: transitively reload nested modules.
Alternative coding: nonrecursive, explicit stack.
"""
import types
from reloadall import status, tryreload, tester
def transitive_reload(objects, visited):
while objects:
next = objects.pop() # Delete next item at end
if (type(next) == types.ModuleType # Is it a module object?
and next not in visited): # Not already reloaded?
status(next) # Reload this, push attrs
tryreload(next)
visited.add(next)
objects.extend(next.__dict__.values())
def reload_all(*args):
transitive_reload(list(args), set())
if __name__ == '__main__':
tester(reload_all, 'reloadall3') # Test: reload myself or arg