Do I need to import submodules directly?

If I want to use a method in foo.bar, do I need to import foo.bar directly or is importing foo sufficient?

You’ll need to import the submodule explicitly. Executing import foo.bar will automatically import the parent module foo, and necessarily bind the name foo, but the reverse is not true.

But I could have sworn I’ve seen code where it’s not imported directly and still works fine

Yes. Sometimes accessing a submodule works without the explicit import. This happens when a parent module itself imports the submodules. Never rely on that unless it’s documented, because it may be an implementation detail and could change without warning after a library version upgrade.

As an example of a popular library which demonstrates both behaviors, look at requests==2.18.4. This package has submodules called sessions and help (amongst others). Importing requests will make requests.sessions available implicitly, yet requests.help will not be available until explicitly imported. You’ll find when the source code of the package init is executed that the sessions submodule gets imported, but the help submodule does not.

This makes sense, because subsequent use of foo.bar requires an attribute access on an existing foo object. Note that from foo.bar import something does not bind the name foo nor foo.bar, though both modules foo and foo.bar are imported and cached into sys.modules.

Leave a Comment