名称空间控制和惰性导入机制
apipkg的Python项目详细描述
欢迎来到APIPKG!
使用apipkg,您可以控制python包的导出名称空间,并 大大减少用户的导入数量。 它是一个在cpython 2.7和3.4+上工作的small pure Python module, 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", } }
包是用字典作为命名空间初始化的。
您需要用^{tt4}创建一个_mypkg包$ 以及包含各个类的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函数并 很好去。
反馈?
如果您有问题,欢迎使用
- 加入irc.freenode.net上的pylib频道
- 在https://github.com/pytest-dev/apipkg/issues 上创建问题
玩得开心, 霍尔格·克雷克尔