Skip to main content
Version: 1.2.2

lazy_import

FunctionPrivateSource

module: ModuleType = lazy_import(
name: str,
package: str | None = __pkg_name__,
required: bool = True,
dependencies: str | Sequence[str] | None = None,
rel_dependencies: ModuleType | Sequence[ModuleType] | None = None,
)

Perform the lazy import for a module.

The returned module will not be loaded until it is actually used.

Modified from:

https://docs.python.org/3/library/importlib.html#implementing-lazy-imports

Arguments

Requires

ArgumentTypeRequired
Description
namestrThe name of the module. It does not need to start with the . symbol.
packagestr

The name of the package (anchor).

By default: will use the __name__ of the pacakge where this utils module is placed. if utils is not placed as a sub-module, and package is not specified, will search name by absolute import.

If using None: will search name by absolute import.

requiredstrWhether to require the existence of the module. If not specified, will allow to load an empty module when the module is not found.
dependenciesstr

One or more depdencies for the module to be loaded.

If not specified, it means that the module does not need dependencies. If specified, the module is only loaded when all dependencies are detected. Otherwise, returns a module placeholder. The dependencies are module names following the abosolute import rules.

rel_dependenciesstrOne or more relative dependencies. Each item is a module (can be lazy). If using None, will use an empty list.

Returns

ArgumentType
Description
moduleModuleTypeA lazy loaded module. It will be loaded when actually using it.

Example

Load a module only when it is accessed

lazy_load.py
from typing import TYPE_CHECKING
from syncstream import utils

if TYPE_CHECKING:
import curses
else:
curses = utils.lazy_import("curses", package=None)


print(curses) # Not loaded yet
curses.error
print(curses) # Loaded

Load a module and specify some pre-requisition

Suppose that numpy is not installed.

lazy_load_with_reqs.py
from typing import TYPE_CHECKING
from syncstream import utils

if TYPE_CHECKING:
import curses
else:
curses = utils.lazy_import("curses", package=None, dependencies=("numpy",))


print(curses)
curses.error
print(curses)

Load an optional module and specify some pre-requisition

Suppose that numpy is not installed.

lazy_load_with_reqs_optional.py
from typing import TYPE_CHECKING
from syncstream import utils

if TYPE_CHECKING:
import curses
else:
curses = utils.lazy_import(
"curses", package=None, dependencies=("numpy",), required=False
)


print(curses)
print(curses.__file__)
print(curses)