27

I've seen it a lot in python/Lib source code but I don't know what it is for.

I thought it was used to limit accessible members of of a module. So only the elements at __all__ will show up when dir(module).

I did a little example and saw it was not working as I expected.

So... What's the python __all__ module level variable for?

1

3 Answers 3

51

It has two purposes:

  1. 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.

  2. When using 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.

Sign up to request clarification or add additional context in comments.

3 Comments

Not just anybody, also anything. Some api documentation tools respect __all__. pydoc does, and I'm pretty sure epydoc and the like also do.
The public variables in a '.py' is available in another file when we do a 'import *', even if they are not included in the all.can any one please clarify about this..?
Sphinx also respects __all__
8

http://docs.python.org/tutorial/modules.html#importing-from-a-package

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__.py code 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.

Comments

4

It controls what you get pulled into your namepsace when you

from blah import *

See Importing * from a Package

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.