
On 05/30/2015 11:45 AM, Ron Adam wrote:
The solution I found was to call a function to explicitly set the shared items in the imported module.
A bit of an improvement... def export_to(module, **d): """ Explitely share objects with imported module. Use this_module.item in the sub-module after item is exported to it. """ from collections import namedtuple namespace = namedtuple("exported", d.keys()) for k, v in d.items(): setattr(namespace, k, v) # Not sure about this. Possibly sys.get_frame would be better. setattr(module, __loader__.name, namespace) And used like this. import sub_mod export_to(sub_mod, foo=foo, bar=bar) Then functions in sub-mod can access the objects as if the sub-module imported the parent module, but only the exported items are visible to the sub module. Again, this is for closely dependent modules that can't easily be split by moving common objects into a mutually imported file, or if it is desired to split a larger module by functionality rather than dependency. There are some limitations, but I think they are actually desirable features. The sub-module can't use exported objects at the top level, and it can't alter the parent modules name space directly. Of course, it could just be my own preferences. I like the pattern of control (the specifying of what gets imported/shared) flowing from the top down. Cheers, Ron