跳转到主要内容

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.pyothermodule.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 函数,即可继续操作。

反馈?

如果您有任何问题,欢迎

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面