Difference Between ‘from x.y import z’ and ‘import x.y.z as z’ in Python

pythonpython-import

In situations where you want to import a nested module into your namespace, I've always written it like this:

from concurrent import futures

However, I recently realized that this can be expressed using the "as" syntax as well. See the following:

import concurrent.futures as futures

Which has the subjective advantage of looking more similar to other imports:

import sys
import os
import concurrent.futures as futures

… with the disadvantage of added verbosity.

Is there a functional difference between the two, or is one officially preferred in a PEP or otherwise?

Best Answer

There are a few functional differences. First, as already mentioned in the comments, import package.thing as thing requires thing to be a module (or a subpackage, which is not actually a separate case because packages count as modules).

Second, in Python 3.5 and later, if from package import thing finds that the module object for package does not have a thing attribute, it will try to look up sys.modules['package.thing'] as a fallback. This was added to handle certain cases of circular relative imports. import package.thing as thing does not yet perform this handling, but it will in Python 3.7.

Related Question