This question already has an answer here:
Can someone explain __all__ in Python?
It has two purposes:
Anybody who reads the source will know what the exposed public API is. It doesn't prevent them from poking around in private declarations, but does provide a good warning not to.
from mod import *, only names listed in
__all__ will be imported. This is not as important, in my opinion, because importing everything is a really bad idea.
Now what happens when the user writes
from sound.effects import *? Ideally, one would hope that this somehow goes out to the filesystem, finds which submodules are present in the package, and imports them all. This could take a long time and importing sub-modules might have unwanted side-effects that should only happen when the sub-module is explicitly imported.
The only solution is for the package author to provide an explicit index of the package. The import statement uses the following convention: if a package’s
__init__.pycode defines a list named
__all__, it is taken to be the list of module names that should be imported when
from package import *is encountered. It is up to the package author to keep this list up-to-date when a new version of the package is released. Package authors may also decide not to support it, if they don’t see a use for importing * from their package.
It controls what you get pulled into your namepsace when you
from blah import *
See Importing * from a Package