类对象入口点访问
entrypointer的Python项目详细描述
setuptools包提供了一个称为 “入口点”。entrypoint是对python对象的命名引用, 例如函数、类或值,其他包可以 使用入口点组和名称的引用。这些对 创建可扩展的python项目,因为一个项目可以创建 将被另一个项目用作钩子或插件的入口点。 然而,使用入口点是相当困难的;setuptools 提供pkg_resources.iter_entry_points()函数,该函数 遍历已定义的入口点,但调用方仍必须 加载入口点,这可能会导致一些错误 必须捕获,以便下一个具有给定名称的入口点可以 尝试。
此包提供入口点的另一个接口,入口点 消除了这个样板,更容易使用,而且速度更快 重复访问特定入口点。这是通过 创建类字典和类列表对象以表示 入口点组和加载入口点列表。一个特殊的物体, eps,还提供了对入口点组的引用。 通过简单的属性访问。
查找入口点
我们从一个例子开始。假设您的应用程序查找 entrypoint组中名为“hook”的入口点 “示例应用程序示例组”。这可以简单到:
hook = entrypointer.eps.example_app.example_group['hook']
如果指定的入口点不存在,这将提高^ {TT5}$, 但是您可以使用get()方法返回其他内容 相反:
hook = entrypointer.eps.example_app.example_group.get('hook')
对于钩子方法,您的应用程序实际上可能更喜欢调用 定义的钩子。这可以像这样完成:
for hook in entrypointer.eps.example_app.example_group.get_all('hook', []): hook('calling your hook')
一些应用程序可能希望使用发生的入口点组名 不是有效的python标识符,例如“example app.example 组”。这可以通过一个简单的getattr()调用来实现 entrypoint.eps:
group = getattr(entrypointer.eps, 'Example App.Example Group')
对组名的唯一限制是任何组件都不能启动 带前导下划线('''')。
使用不带entrypointer.eps
的入口点entrypointer.eps对象是为了方便而提供的;它不是 必须使用。为 entrypoint组,简单地实例化 entrypointer.EntrypointDict类:
group = entrypointer.EntrypointDict('example_app.example_group') hooks = group.get_all('hook')
此类提供所有基本的dict方法,例如 keys()和values()。它还提供了一些变体,例如 items_all(),它产生入口点的类列表对象。这个 允许将入口点用于各种效果,例如 上面演示的“hook”模式,或者用于扩展 应用程序可供使用,或用于各种其他用途。
获取入口点列表
尽管建议使用entrypointer.EntrypointDict 类访问入口点,可以使用如下列表 对象,entrypointer.EntrypointList,直接。它被实例化了 使用入口点组名和入口点本身的名称, 例如:
hooks = entrypointer.EntrypointList('example_app.example_group', 'hook')
效率考虑因素
pkg_resources.iter_entry_points()函数有点慢。 entrypointer.EntrypointList和 entrypointer.EntrypointDict类被设计为只调用很少的类 尽可能多次并缓存结果以备将来使用。而且,他们 针对使用第一个入口点的常见情况进行了优化 给定名称;在第一个 加载成功。最后,这些班懒洋洋地做作业, 仅在需要时调用pkg_resources.iter_entry_points()。 实现所调用的方法。这导致了使用 在申请有效期内摊销的入口点, 同时由于高速缓存仍然保持高速。但是,有一个 这种缓存的副作用是对已安装包的更改 打个电话就知道了 ^使用时将不会检测到{tt3}$。 entrypointer;如果这对您的应用程序很重要,您可以 想调用entrypointer.EntrypointDict和 entrypoint.EntrypointList类并在 你完了,注意这会让你尽可能提高效率 需要更频繁地调用pkg_resources.iter_entry_points()。