<a href="https://explosion.ai"><img src="https://yellow-cdn.veclightyear.com/835a84d5/4e32555a-1c24-4eaa-bff0-17c4393e91ad.svg" width="125" height="125" align="right" /></a>
catalogue是一个微小的、零依赖的库,它使得在你的代码中添加函数(或对象)注册表变得简单。当你有需要既容易序列化又完全可定制的对象时,函数注册表非常有用。你不需要将函数传入对象,而是传入一个标识符名称,对象可以使用这个名称从注册表中查找函数。这使得对象易于序列化,因为名称只是一个简单的字符串。如果你直接保存函数,你就必须使用Pickle进行序列化,而这有许多缺点。
pip install catalogue
conda install -c conda-forge catalogue
⚠️ 重要提示:
cataloguev2.0+仅兼容Python 3.6+。 对于Python 2.7+兼容性,请使用cataloguev1.x。
假设你正在开发一个需要在某处加载数据的Python包。你已经为最常见的数据类型实现了一些加载器函数,但你希望允许用户轻松添加他们自己的加载器。使用catalogue.create,你可以在命名空间your_package → loaders下创建一个新的注册表。
# 你的包 import catalogue loaders = catalogue.create("your_package", "loaders")
这会给你一个loaders.register装饰器,你的用户可以导入并用它装饰他们的自定义加载器函数。
# 用户代码 from your_package import loaders @loaders.register("custom_loader") def custom_loader(data): # 在这里加载一些东西... return data
装饰的函数将自动注册,在你的包中,你可以通过调用loaders.get_all来访问所有加载器。
# 你的包 def load_data(data, loader_id): print("所有加载器:", loaders.get_all()) # {"custom_loader": <custom_loader>} loader = loaders.get(loader_id) return loader(data)
现在用户可以只使用字符串名称("custom_loader")来引用他们的自定义加载器,你的应用程序将知道该怎么做并使用他们的自定义函数。
# 用户代码 from your_package import load_data load_data(data, loader_id="custom_loader")
custom_loader函数吗?当然可以,这是更经典的回调方法。load_data可以接受一个函数而不是字符串ID,在这种情况下你就不需要像这样的包。当你需要生成一个可序列化的记录来记录传入了哪些函数时,catalogue会有所帮助。例如,你可能想写一条日志消息,或保存一个配置以便稍后 加载你的对象。使用catalogue,你的函数可以通过字符串参数化,因此日志记录和序列化仍然很容易 – 同时还保持了完全的可扩展性。
装饰器通常在模块导入时运行。依赖这种副作用有时会导致混淆,特别是当没有其他理由导入该模块时。一个解决方案是使用入口点。
例如,在spaCy中,我们开始使用函数注册表来使管道组件更加可定制。假设一个用户Jo使用新的机器学习研究开发了一个更好的标注模型。Jo的包的终端用户应该能够写spacy.load("jo_tagging_model")。他们不应该需要先记得写import jos_tagged_model,只是为了运行函数注册表作为副作用。使用入口点,注册会在安装时发生 – 所以你不需要依赖导入的副作用。
catalogue.create为给定的命名空间创建一个新的注册表。返回一个设置函数,可以用作装饰器或使用名称和func关键字参数调用。如果设置了entry_points=True,注册表将在Registry.get和Registry.get_all中检查为给定命名空间公布的Python入口点,例如命名空间"spacy", "architectures"的入口点组spacy_architectures。这允许其他包自动注册函数。
| 参数 | 类型 | 描述 |
|---|---|---|
*namespace | str | 命名空间,例如"spacy"或"spacy", "architectures"。 |
entry_points | bool | 是否检查给定命名空间的入口点并预填充全局注册表。 |
| 返回 | Registry | 带有注册和检索函数方法的Registry对象。 |
architectures = catalogue.create("spacy", "architectures") # 用作装饰器 @architectures.register("custom_architecture") def custom_architecture(): pass # 用作普通函数 architectures.register("custom_architecture", func=custom_architecture)
Registry可用于注册和检索函数的注册表对象。它通常在你调用catalogue.create时内部创建。
Registry.__init__初始化一个新的注册表。如果设置了entry_points=True,注册表将在Registry.get和Registry.get_all中检查为给定命名空间公布的Python入口点,例如命名空间"spacy", "architectures"的入口点组spacy_architectures。
| 参数 | 类型 | 描述 |
|---|---|---|
namespace | Tuple[str] | 命名空间,例如 "spacy" 或 "spacy", "architectures"。 |
entry_points | bool | 在 get 和 get_all 中是否检查给定命名空间的入口点。 |
| 返回值 | Registry | 新创建的对象。 |
# 用户接口 architectures = catalogue.create("spacy", "architectures") # 内部接口 architectures = Registry(("spacy", "architectures"))
Registry.__contains__检查注册表中是否包含某个名称。
| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 要检查的名称。 |
| 返回值 | bool | 该名称是否在注册表中。 |
architectures = catalogue.create("spacy", "architectures") @architectures.register("custom_architecture") def custom_architecture(): pass assert "custom_architecture" in architectures
Registry.__call__在注册表的命名空间中注册一个函数。可以作为装饰器使用,也可以作为函数调用,通过 func 关键字参数提供要注册的函数。委托给 Registry.register。
Registry.register在注册表的命名空间中注册一个函数。可以作为装饰器使用,也可以作为函数调用,通过 func 关键字参数提供要注册的函数。
| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 在命名空间下注册的名称。 |
func | Any | 要注册的可选函数(如果不用作装饰器)。 |
| 返回值 | Callable | 接受一个参数(名称)的装饰器。 |
architectures = catalogue.create("spacy", "architectures") # 用作装饰器 @architectures.register("custom_architecture") def custom_architecture(): pass # 用作普通函数 architectures.register("custom_architecture", func=custom_architecture)
Registry.get获取在命名空间中注册的函数。
| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 名称。 |
| 返回值 | Any | 注册的函数。 |
custom_architecture = architectures.get("custom_architecture")
Registry.get_all获取注册表命名空间中的所有函数。
| 参数 | 类型 | 描述 |
|---|---|---|
| 返回值 | Dict[str, Any] | 注册的函数,以名称为键。 |
all_architectures = architectures.get_all() # {"custom_architecture": <custom_architecture>}
Registry.get_entry_points获取其他包为此命名空间注册的入口点。入口点组的名称是由下划线连接的命名空间。
| 参数 | 类型 | 描述 |
|---|---|---|
| 返回值 | Dict[str, Any] | 加载的入口点,以名称为键。 |
architectures = catalogue.create("spacy", "architectures", entry_points=True) # 将获取所有 "spacy_architectures" 组的入口点 all_entry_points = architectures.get_entry_points()
Registry.get_entry_point检查命名空间中是否有给定名称的已注册入口点并加载它。否则,返回默认值。
| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 要加载的入口点名称。 |
default | Any | 要返回的默认值。默认为 None。 |
| 返回值 | Any | 加载的入口点或默认值。 |
architectures = catalogue.create("spacy", "architectures", entry_points=True) # 将获取 "spacy_architectures" 组中的 "custom_architecture" 入口点 custom_architecture = architectures.get_entry_point("custom_architecture")
Registry.find查找已注册函数的信息,包括它定义所在的模块和文件路径、行号以及文档字符串(如果有的话)。
| 参数 | 类型 | 描述 |
|---|---|---|
name | str | 已注册函数的名称。 |
| 返回值 | Dict[str, Union[str, int]] | 函数的信息。 |
import catalogue architectures = catalogue.create("spacy", "architectures", entry_points=True) @architectures("my_architecture") def my_architecture(): """这是一个架构""" pass info = architectures.find("my_architecture") # {'module': 'your_package.architectures', # 'file': '/path/to/your_package/architectures.py', # 'line_no': 5, # 'docstring': '这是一个架构'}
catalogue.check_exists检查命名空间是否存在。
| 参数 | 类型 | 描述 |
|---|---|---|
*namespace | str | 命名空间,例如 "spacy" 或 "spacy", "architectures"。 |
| 返回值 | bool | 命名空间是否存在 。 |


职场AI,就用扣子
AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!


多风格AI绘画神器
堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。


零代码AI应用开发平台
零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。


免费创建高清无水印Sora视频
Vora是一个免费创建高清无水印Sora视频的AI工具


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。
最新AI工具、AI资讯
独家AI资源、AI项目落地

微信扫一扫关注公众号