轻松实现按需加载子包和函数。
项目描述
lazy_loader
使得按需加载子包和函数变得容易。
动机
- 允许子包在不产生导入成本的情况下对用户可见。
- 允许外部库仅在需要时导入,从而提高导入时间。
有关更详细的讨论,请参阅SPEC。
安装
pip install -U lazy_loader
我们建议使用Python >= 3.11的lazy_loader
。如果使用Python 3.11,请升级到3.11.9或更高版本。如果使用Python 3.12,请升级到3.12.3或更高版本。这些版本避免了一个已知的竞争条件。
用法
懒加载子包
考虑来自scikit-image的__init__.py
subpackages = [
...,
'filters',
...
]
import lazy_loader as lazy
__getattr__, __dir__, _ = lazy.attach(__name__, subpackages)
现在您可以这样做
import skimage as ski
ski.filters.gaussian(...)
只有在访问时才会加载filters
子包。
懒加载子包和函数
考虑skimage/filters/__init__.py
from ..util import lazy
__getattr__, __dir__, __all__ = lazy.attach(
__name__,
submodules=['rank'],
submod_attrs={
'_gaussian': ['gaussian', 'difference_of_gaussians'],
'edges': ['sobel', 'scharr', 'prewitt', 'roberts',
'laplace', 'farid']
}
)
上面的代码等同于
from . import rank
from ._gaussian import gaussian, difference_of_gaussians
from .edges import (sobel, scharr, prewitt, roberts,
laplace, farid)
不同之处在于,所有子包(如rank
)和函数(如sobel
)在访问时都会被加载。
类型检查器
静态类型检查器和IDE无法从懒加载导入中推断类型信息。作为解决方案,您可以使用lazy.attach_stub
加载类型存根(.pyi
文件)。
import lazy_loader as lazy
__getattr__, __dir__, _ = lazy.attach_stub(__name__, "subpackages.pyi")
请注意,由于导入现在定义在.pyi
文件中,它们不仅对类型检查是必要的,在运行时也是必要的。
SPEC 详细描述了此解决方案。
早期失败
使用懒加载,缺失的导入在加载库时不再失败。在开发和测试期间,您可以设置EAGER_IMPORT
环境变量来禁用懒加载。
外部库
上面讨论的lazy.attach
函数用于设置包内部导入。
使用lazy.load
来懒加载外部库
sp = lazy.load('scipy') # `sp` will only be loaded when accessed
sp.linalg.norm(...)
请注意,懒加载子包,即load('scipy.linalg')
将导致包含子包的包立即导入;因此,不建议使用此用法。
您可以要求lazy.load
在调用时立即引发导入错误
linalg = lazy.load('scipy.linalg', error_on_import=True)
可选要求
懒加载的一个用途是加载可选依赖项,只有当访问可选功能时才会出现ImportErrors
。如果可选功能依赖于特定版本,可以设置版本要求
np = lazy.load("numpy", require="numpy >=1.24")
在这种情况下,如果安装了numpy
,但版本小于1.24,则返回的np
模块将在属性访问时引发错误。使用此功能不是全有或全无:一个模块可能依赖于numpy的一个版本,而另一个模块可能不设置任何要求。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分布
构建分布
lazy_loader-0.4.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1 |
|
MD5 | 0ed9a697d30fbe5b7f24106b448d634d |
|
BLAKE2b-256 | 6f6bc875b30a1ba490860c93da4cabf479e03f584eba06fe5963f6f6644653d8 |
lazy_loader-0.4-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc |
|
MD5 | 9f0ab8b0139a27988ac8e5447f21369e |
|
BLAKE2b-256 | 8360d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f |