I am currently packaging my own module for distribution. In general everything is working fine, but fine-tuning/best-practice for structuring sub-modules is giving me some trouble.
Assuming a module structure of:
mdl
├── mdl
│ ├── __init__.py
│ ├── core.py
| ├── sub_one
| | ├── __init__.py
| | └── core_sub_one.py
| └── sub_two
| ├── __init__.py
| └── core_sub_two.py
├── README
└── setup.py
core file headers
With the header of core.py
starting with:
import numpy as np
...some fairly large module code...
And the headers of both core_sub_one.py
and core_sub_two.py
starting with:
import numpy as np
from .. import core as cr
So all submodules require np
and cr
.
init.py structure
The mdl/__init__.py
(core-level) looks like:
from . import sub_one as so
from . import sub_two as st
And __init__.py
of both submodules looks like (replace one
with two
for the other submodule):
from . import core_sub_one
from .core_sub_one import *
I've "learnt" this structure from numpy
, see f.i. numpy/ma/__init__.py
Problem description
Now I've got some trouble with the submodule-access after running setup.py
and importing my module with import mdl
.
I can now access my submodules with f.i. mdl.so.some_function_in_sub_one()
. This is expected and what I want.
But I can also access the top level module cr
and numpy
with mdl.so.cr
and mdl.so.np
, which I want to avoid. Is there any way to avoid this?
If not: Is there any drawback of importing/connecting modules and submodules like this?
And is there any best practice for how to import libraries like numpy
in sub-modules, when they are required in all submodules?
Edit:
Since some seem to have trouble with the fact that asking for best practice is opinion based (which I know and which I intended, since imho most design decisions in real life are not clear binary 1-0 decisions), I have to add:
I want to comply with the module packaging style used in the scipy
, and more specifically numpy
, package environment. So if these packages found a solution for any of the questions I asked, this will be the most welcome solution for me.