This chapter concludes this part of the book with a collection of
more advanced module-related
topics—data hiding, the
sys.path changes, listing tools,
running modules by name string, transitive reloads, and so on—along with
the standard set of gotchas and exercises related to what we’ve covered
in this part of the book.
Along the way, we’ll build some larger and more useful tools than we have so far, that combine functions and modules. Like functions, modules are more effective when their interfaces are well defined, so this chapter also briefly reviews module design concepts, some of which we have explored in prior chapters.
Despite the word “advanced” in this chapter’s title, this is also
something of a grab bag of additional module topics. Because some of the
topics discussed here are widely used (especially the
__name__ trick), be sure to take a look before
moving on to classes in the next part of the book.
As we’ve seen, a Python module exports all the names assigned at the top level of its file. There is no notion of declaring which names should and shouldn’t be visible outside the module. In fact, there’s no way to prevent a client from changing names inside a module if it wants to.
In Python, data hiding in modules is a convention, not a syntactical constraint. If you want to break a module by trashing its names, you can, but fortunately, I’ve yet to meet a programmer who would. ...