apipkg:命名空间控制和懒加载导入机制
项目描述
欢迎使用apipkg !
使用apipkg,您可以控制Python包导出的命名空间,并大大减少用户所需的导入数量。这是一个 小型纯Python模块,支持CPython 3.7+、Jython和PyPy。它与Python的 help() 系统、自定义导入器(PEP302)和常见的命令行补全工具良好协作。
使用非常简单:您可以将“apipkg”作为依赖项要求,或者将约200行的代码复制粘贴到您的项目中。
教程示例
这是一个简单的 mypkg 包,指定了一个命名空间,并导出了来自不同模块的两个对象
# mypkg/__init__.py
import apipkg
apipkg.initpkg(__name__, {
'path': {
'Class1': "_mypkg.somemodule:Class1",
'clsattr': "_mypkg.othermodule:Class2.attr",
}
}
包使用字典作为命名空间初始化。
您需要创建一个名为 _mypkg 的包,包含 somemodule.py 和 othermodule.py,其中包含相应的类。 _mypkg 并非特殊,它是一个完全正规的 Python 包。
命名空间字典包含 name: value 映射,其中值可以是另一个命名空间字典或指定导入位置的字符串。访问命名空间属性时将执行导入。
>>> import mypkg
>>> mypkg.path
<ApiModule 'mypkg.path'>
>>> mypkg.path.Class1 # '_mypkg.somemodule' gets imported now
<class _mypkg.somemodule.Class1 at 0xb7d428fc>
>>> mypkg.path.clsattr # '_mypkg.othermodule' gets imported now
4 # the value of _mypkg.othermodule.Class2.attr
当访问时,mypkg.path 命名空间及其两个条目将被加载。这意味着
延迟加载 - 只加载实际需要的部分
只有根 "mypkg" 需要导入才能访问完整的功能
底层模块也易于访问,例如
from mypkg.sub import Class1
将 apipkg 包含在您的包中
如果您不希望在您的包中添加 apipkg 依赖项,可以将 apipkg.py 文件复制到您的包中的某个位置,例如上述示例中的 _mypkg/apipkg.py。然后从该新位置导入 initpkg 函数,即可继续操作。
反馈?
如果您有任何问题,欢迎
加入 #pytest 频道,位于 irc.libera.chat(使用 IRC 客户端,通过 webchat 或通过 Matrix)。
在 bugtracker 上创建一个问题
关闭
apipkg-3.0.2.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | c7aa61a4f82697fdaa667e70af1505acf1f7428b1c27b891d204ba7a8a3c5e0d |
|
MD5 | e07ca259f7bc1581b9e7f4a4f96b08ff |
|
BLAKE2b-256 | 2e2c717870bddbb588428093de4bfbce59c58d29b56bff76ecd422fd1724ae72 |