Let’s assume I have a main script, main.py, that imports another python file with import coolfunctions and another: import chores
Now, suppose coolfunctions also uses stuff from chores, hence I declare import chores inside coolfunctions.
Since both main.py, and coolfunctions import chores ~ is this redundant? Is there any other way of doing this? Am I doing it correctly?
I’m confused about how python projects should be structured in general. I have a “conf.py” file, that I import for a bunch of variables ~ is this a module or not? I load this conf file in multiple places as well.
Each module X should import all (and only) the modules Y, Z, T, … whose functionality it requires, without any worry about what other modules Fee, Fie, Foo … (if any) may have already done part or all of those imports, or may be going to do so in the future.
It would make a module extremely fragile (indeed, it would be the very opposite of modularity!) if each module had to worry about such subtle, “covert-channel” effects.
What other modules Y, Z, T, …, each module X chooses to import (if any) is part of X’s implementation details, and shouldn’t concern anybody except the developers who are coding, testing, or maintaining X.
In order to ensure that this is the case, and that this clearly-best strategy of decoupling can and will fully be followed by sane code, Python “caches” modules as they get imported: a module is “loaded” only once per run of a program, the first time anybody imports it (or anything from inside it) — all other imports use the same object obtained by that first loading, which Python keeps in a cache (which is specified as being the dict
sys.modules, but you need to know that detail only for somewhat-advanced programming techniques… don’t worry about it, 98.7% of the time — just remember that “import is cheap”!-).Sure, a
conf.pythat you use from several other modules viaimport confis definitely a module (you may think you’re loading it multiple times, but you aren’t unless you’re using pretty advanced and deliberate techniques indeed for the purpose) — why shouldn’t it be?