[Python-ideas] Explicitly shared objects with sub modules vs import
Ron Adam
ron3200 at gmail.com
Sat May 30 17:45:54 CEST 2015
While trying to debug a problem and thinking that it may be an issue with
circular imports, I come up with an interesting idea that might be of
value. It wasn't a circular import problem in this case, but I may have
found the actual bug sooner if I didn't need to be concerned about that
possibility.
I have had some difficulty splitting larger modules into smaller modules in
the past where if I split the code by functionality, it doesn't correspond
with how the code is organized by dependency. The result is an imported
module needs to import the module it's imported into. Which just doesn't
feel right to me.
The solution I found was to call a function to explicitly set the shared
items in the imported module.
(The example is from a language I'm experimenting with written in python.
So don't be concerned about the shared object names in this case.)
In the main module...
import parse
parse.set_main(List=List,
Keyword=Keyword,
Name=Name,
String=String,
Express=Express,
keywords=keywords,
raise_with=raise_with,
nil=nil)
And in parse...
# Sets shared objects from main module.
from collections import namedtuple
def set_main(**d):
global main
main = namedtuple(__name__, d.keys())
for k, v in d.items():
setattr(main, k, v)
After this, the sub module access's the parent modules objects with...
main.Keyword
Just the same as if the parent module was imported as main, but it only
shares what is intended to be shared within this specific imported module.
I think that is better than using "import from" in the sub module. And
an improvement over importing the whole module which can possibly expose
too much.
The benifits:
* The shared items are explicitly set by the parent module.
* If an item is missing, it results in a nice error message
* Accessing objects works the same as if import was used.
* It avoids (most) circular import problems.
* It's easier to think about once you understand what it does.
The problem is the submodule needs a function to make it work. I think it
would be nice if it could be made a builtin but doing that may be tricky.
Where I've used "main", it could set the name of the shared parent
module(s) automatically.
The name of the function probably should be "shared" or "sharing". (Or
some other thing that makes sense.)
I would like to hear what other here think, and of course if there are any
obvious improvements that can be made.
Would this be a good candidate for a new builtin?
Cheers,
Ron
More information about the Python-ideas
mailing list