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
参数
输入
| 参数 | 类型 | 必选 | |
|---|---|---|---|
| name | str | 模块名称。不需要以 .开头。 | |
| package | str | (锚)包的名称。 默认情况下,使用 若使用 | |
| required | str | 是否要求模块必须存在。若未指定该值,则允许在模块未找到的情况下,返回一个空模块作为替代品。 | |
| dependencies | str | 所要加载模块的一个、或多个依赖项。 若并未指定,这表明模块的加载不需要依赖项。若指定,则仅在所指定的依赖项全都找到的情况下、才会加载模块。否则,返回模块占位符。此处的依赖项指的是可以按照绝对导入、导入的模块名称。 | |
| rel_dependencies | str | 一个或多个相对 依赖项。每项值都需要是一个模块(可以是延迟加载模块)。若为 None,则此处留空。 | 
输出
| 参数 | 类型 | |
|---|---|---|
| module | ModuleType | 延迟加载的模块。只会在实际使用它的时候加载。 | 
范例
只在访问到的时候加载模块
- 代码
- 结果
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
<LazyModule curses from "/usr/local/lib/python3.12/curses/__init__.py">
<module 'curses' from '/usr/local/lib/python3.12/curses/__init__.py'>
加载模块、并指派某些前提
- 代码
- 结果
假设未安装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)
Traceback (most recent call last):
  File "/workdir/alpha-test.py", line 7, in <module>
    curses = utils.lazy_import("curses", package=None, dependencies=("numpy",))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/workdir/syncstream/utils.py", line 567, in lazy_import
    return _LazyImporter().lazy_import(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/workdir/syncstream/utils.py", line 503, in lazy_import
    return cls.create_module_placeholder(full_name=full_name, required=required)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/workdir/syncstream/utils.py", line 445, in create_module_placeholder
    raise ModuleNotFoundError(
ModuleNotFoundError: utils: The required module to be lazily loaded is not found: 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)
<ModulePlaceholder curses>
None
<ModulePlaceholder curses>