catalogue

catalogue

函数注册库 catalogue 简化代码定制和序列化

catalogue是一个轻量级函数注册库,无需依赖即可在代码中添加函数或对象注册表。它使用标识符名称替代直接传递函数,实现对象的序列化和定制。该库支持Python 3.6+,提供创建、注册和检索函数的API,并支持入口点功能实现跨包注册。catalogue简化了代码定制和序列化过程,适用于需要可序列化且可定制对象的场景。

catalogue函数注册Python库零依赖可序列化Github开源项目

<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: 适用于你的库的超轻量级函数注册表

catalogue是一个微小的、零依赖的库,它使得在你的代码中添加函数(或对象)注册表变得简单。当你有需要既容易序列化又完全可定制的对象时,函数注册表非常有用。你不需要将函数传入对象,而是传入一个标识符名称,对象可以使用这个名称从注册表中查找函数。这使得对象易于序列化,因为名称只是一个简单的字符串。如果你直接保存函数,你就必须使用Pickle进行序列化,而这有许多缺点。

tests Current Release Version pypi Version conda Version Code style: black

⏳ 安装

pip install catalogue
conda install -c conda-forge catalogue

⚠️ 重要提示: catalogue v2.0+仅兼容Python 3.6+。 对于Python 2.7+兼容性,请使用catalogue v1.x。

👩‍💻 使用方法

假设你正在开发一个需要在某处加载数据的Python包。你已经为最常见的数据类型实现了一些加载器函数,但你希望允许用户轻松添加他们自己的加载器。使用catalogue.create,你可以在命名空间your_packageloaders下创建一个新的注册表。

# 你的包 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,只是为了运行函数注册表作为副作用。使用入口点,注册会在安装时发生 – 所以你不需要依赖导入的副作用。

🎛 API

<kbd>函数</kbd> catalogue.create

为给定的命名空间创建一个新的注册表。返回一个设置函数,可以用作装饰器或使用名称和func关键字参数调用。如果设置了entry_points=True,注册表将在Registry.getRegistry.get_all中检查为给定命名空间公布的Python入口点,例如命名空间"spacy", "architectures"的入口点组spacy_architectures。这允许其他包自动注册函数。

参数类型描述
*namespacestr命名空间,例如"spacy""spacy", "architectures"
entry_pointsbool是否检查给定命名空间的入口点并预填充全局注册表。
返回Registry带有注册和检索函数方法的Registry对象。
architectures = catalogue.create("spacy", "architectures") # 用作装饰器 @architectures.register("custom_architecture") def custom_architecture(): pass # 用作普通函数 architectures.register("custom_architecture", func=custom_architecture)

<kbd></kbd> Registry

可用于注册和检索函数的注册表对象。它通常在你调用catalogue.create时内部创建。

<kbd>方法</kbd> Registry.__init__

初始化一个新的注册表。如果设置了entry_points=True,注册表将在Registry.getRegistry.get_all中检查为给定命名空间公布的Python入口点,例如命名空间"spacy", "architectures"的入口点组spacy_architectures

参数类型描述
namespaceTuple[str]命名空间,例如 "spacy""spacy", "architectures"
entry_pointsboolgetget_all 中是否检查给定命名空间的入口点。
返回值Registry新创建的对象。
# 用户接口 architectures = catalogue.create("spacy", "architectures") # 内部接口 architectures = Registry(("spacy", "architectures"))

<kbd>方法</kbd> Registry.__contains__

检查注册表中是否包含某个名称。

参数类型描述
namestr要检查的名称。
返回值bool该名称是否在注册表中。
architectures = catalogue.create("spacy", "architectures") @architectures.register("custom_architecture") def custom_architecture(): pass assert "custom_architecture" in architectures

<kbd>方法</kbd> Registry.__call__

在注册表的命名空间中注册一个函数。可以作为装饰器使用,也可以作为函数调用,通过 func 关键字参数提供要注册的函数。委托给 Registry.register

<kbd>方法</kbd> Registry.register

在注册表的命名空间中注册一个函数。可以作为装饰器使用,也可以作为函数调用,通过 func 关键字参数提供要注册的函数。

参数类型描述
namestr在命名空间下注册的名称。
funcAny要注册的可选函数(如果不用作装饰器)。
返回值Callable接受一个参数(名称)的装饰器。
architectures = catalogue.create("spacy", "architectures") # 用作装饰器 @architectures.register("custom_architecture") def custom_architecture(): pass # 用作普通函数 architectures.register("custom_architecture", func=custom_architecture)

<kbd>方法</kbd> Registry.get

获取在命名空间中注册的函数。

参数类型描述
namestr名称。
返回值Any注册的函数。
custom_architecture = architectures.get("custom_architecture")

<kbd>方法</kbd> Registry.get_all

获取注册表命名空间中的所有函数。

参数类型描述
返回值Dict[str, Any]注册的函数,以名称为键。
all_architectures = architectures.get_all() # {"custom_architecture": <custom_architecture>}

<kbd>方法</kbd> Registry.get_entry_points

获取其他包为此命名空间注册的入口点。入口点组的名称是由下划线连接的命名空间。

参数类型描述
返回值Dict[str, Any]加载的入口点,以名称为键。
architectures = catalogue.create("spacy", "architectures", entry_points=True) # 将获取所有 "spacy_architectures" 组的入口点 all_entry_points = architectures.get_entry_points()

<kbd>方法</kbd> Registry.get_entry_point

检查命名空间中是否有给定名称的已注册入口点并加载它。否则,返回默认值。

参数类型描述
namestr要加载的入口点名称。
defaultAny要返回的默认值。默认为 None
返回值Any加载的入口点或默认值。
architectures = catalogue.create("spacy", "architectures", entry_points=True) # 将获取 "spacy_architectures" 组中的 "custom_architecture" 入口点 custom_architecture = architectures.get_entry_point("custom_architecture")

<kbd>方法</kbd> Registry.find

查找已注册函数的信息,包括它定义所在的模块和文件路径、行号以及文档字符串(如果有的话)。

参数类型描述
namestr已注册函数的名称。
返回值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': '这是一个架构'}

<kbd>函数</kbd> catalogue.check_exists

检查命名空间是否存在。

参数类型描述
*namespacestr命名空间,例如 "spacy""spacy", "architectures"
返回值bool命名空间是否存在。

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

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

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

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

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多