跳到主要内容
版本:1.2.2

lazy_import

函数私有源码

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,
)

令某模块延迟加载。

所返回的模块、在实际使用到之前不会加载。

修改自:

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

参数

输入

参数类型必选
说明
namestr模块名称。不需要以.开头。
packagestr

(锚)包的名称。

默认情况下,使用utils所在的包的__name__。若utils并未作为一个子模块放置,且package也并未设置,则会透过绝对导入搜索name

若使用None,则会按绝对导入搜索name

requiredstr是否要求模块必须存在。若未指定该值,则允许在模块未找到的情况下,返回一个空模块作为替代品。
dependenciesstr

所要加载模块的一个、或多个依赖项。

若并未指定,这表明模块的加载不需要依赖项。若指定,则仅在所指定的依赖项全都找到的情况下、才会加载模块。否则,返回模块占位符。此处的依赖项指的是可以按照绝对导入、导入的模块名称。

rel_dependenciesstr一个或多个相对依赖项。每项值都需要是一个模块(可以是延迟加载模块)。若为None,则此处留空。

输出

参数类型
说明
moduleModuleType延迟加载的模块。只会在实际使用它的时候加载。

范例

只在访问到的时候加载模块

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

加载模块、并指派某些前提

假设未安装numpy

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)

加载可选模块、且带有某些前提

假设未安装numpy

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)