类对象入口点访问

entrypointer的Python项目详细描述


https://travis-ci.org/klmitch/entrypointer.svg?branch=master

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.EntrypointListentrypointer.EntrypointDict类被设计为只调用很少的类 尽可能多次并缓存结果以备将来使用。而且,他们 针对使用第一个入口点的常见情况进行了优化 给定名称;在第一个 加载成功。最后,这些班懒洋洋地做作业, 仅在需要时调用pkg_resources.iter_entry_points()。 实现所调用的方法。这导致了使用 在申请有效期内摊销的入口点, 同时由于高速缓存仍然保持高速。但是,有一个 这种缓存的副作用是对已安装包的更改 打个电话就知道了 ^使用时将不会检测到{tt3}$。 entrypointer;如果这对您的应用程序很重要,您可以 想调用entrypointer.EntrypointDictentrypoint.EntrypointList类并在 你完了,注意这会让你尽可能提高效率 需要更频繁地调用pkg_resources.iter_entry_points()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何从同步请求中获取响应代码   具有深度复制的类中的Java oop getter/setter   java LDAP“简单”用户身份验证(JNDI Tomcat)不稳定?   java将Jenkins jnlp代理设置为通过API以编程方式使用WebSocket   java如何获取在servlet筛选器的静态块中启动的静态类的实例?   前两个数字的java charAt循环不能循环它   java在Spring引导执行器中是否有检查子服务运行状况的标准方法?   java我可以将jacksonmapped@JsonProperties推到“顶层”吗?   json JAVA:opencsv随机读取CSV单元格   无第三方应用程序的java捆绑包JRE   使用openidConnectClient功能的WAS Liberty中出现java无效cookie标头错误   java如何在Restful Web服务中从Http Post获取数组?   java如何读取安卓开发的JSON url?   如何在java IO中打开包含汉字的文件?