I'm writing some util modules in Python3.10 and want that all function or class defined in
leaf node .py files can be import easily. Consider the following file sturctures:
A0
├─ B0
│ ├─ __init__.py
│ └─ b0.py
├─ B1
│ ├─ __init__.py
│ └─ b1.py
└─ __init__.py
Where b0.py is difined as:
# __all__ = ['func_b0']
def func_b0():...
def _func_b0():...
def __func_b0():...
If I write from .b0 import * into A0/B0/__init__.py, then I can use from A0.B0 import func_b0 in external file to use my custom function func_b0 easily, instead of use from A0.B0.b0 import func_b0.
My question is, need I add such as __all__ = ['func_b0'] into A0/B0/b0.py to control
A0/B0/__init__.py's import * behavior? If I use private methods, i.e., underline or double underline, I can also control the import * behavior.
In my opinion, using private methods is a better way to control
import * behavior, since only one change is required during maintenance. However, the former __all__=[...] method needs to maintain an additional list.
So, is __all__ not designed to be used here? Is there any PEP to discuss this problem (i.e., maybe import alias)?