using wildcard imports (from … import *)¶
When an import statement in the pattern of
from MODULE import * is used it may become difficult for a Python validator to detect undefined names in the program that imported the module. Furthermore, as a general best practice, import statements should be as specific as possible and should only import what they need.
The following code imports everything from the
math built-in Python module.
# wildcard import = bad from math import *
import statement more specific¶
import statement should be refactored to be more specific about what functions or variables it is using from the
math module. The modified code below specifies exactly which module member it is using, which happens to be
ceil in this example.
from math import ceil
Import the whole module¶
There are some cases where making the
import statement specific is not a good solution:
- It may be unpractical or cumbersome to create or maintain the list of objects to be imported from a module
- A direct import would bind to the same name as that of another object (e.g. from asyncio import TimeoutError)
- The module that the object is imported from would provide valuable contextual information if it is right next to the object when it’s used.
In these cases, use one of these idioms:
import math x = math.ceil(y) # or import multiprocessing as mp pool = mp.pool(8)