In theory, the public API of a Python standard library module is fully
specified as part of its documentation, but in practice it may not be
quite so clear cut. There are other ways to specify the names in a module that
are meant to be public, and there are naming conventions for things that
should not be public (e.g. the name starts with an underscore), but
there is
no real consistency in how those are used throughout the standard library.
A mid-July discussion
on the python-dev mailing list considered the problem and some possible
solutions; the main outcome seems to be interest in making the rules more
explicit.
Source: LWN.net – [$] Python and public APIs