为您的库提供超轻量级功能注册
项目描述
目录:为您的库提供超轻量级功能注册
catalogue
是一个微型、无依赖库,它使得向代码中 添加功能(或对象)注册表 变得容易。当您有需要既易于序列化又可完全自定义的对象时,功能注册表非常有用。您不需要将函数传递给对象,而是传递一个标识符名称,对象可以使用该名称从注册表中查找函数。这使得对象易于序列化,因为名称是一个简单的字符串。如果您保存了函数,则必须使用 Pickle 进行序列化,这有很多缺点。
⏳ 安装
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_package
→ loaders
下创建一个新的注册表。
# YOUR PACKAGE
import catalogue
loaders = catalogue.create("your_package", "loaders")
这为您提供了一个 loaders.register
装饰器,用户可以导入并使用它来装饰他们的自定义加载函数。
# USER CODE
from your_package import loaders
@loaders.register("custom_loader")
def custom_loader(data):
# Load something here...
return data
装饰后的函数将被自动注册,在您的包中,您可以通过调用 loaders.get_all
来访问所有加载器。
# YOUR PACKAGE
def load_data(data, loader_id):
print("All loaders:", loaders.get_all()) # {"custom_loader": <custom_loader>}
loader = loaders.get(loader_id)
return loader(data)
现在,用户只需使用其字符串名称("custom_loader"
)即可引用他们的自定义加载器,并且您的应用程序将知道如何操作并使用他们的自定义函数。
# USER CODE
from your_package import load_data
load_data(data, loader_id="custom_loader")
❓ 常见问题解答
用户不能直接传递 custom_loader
函数吗?
当然可以,这是一种更经典的回调方法。在这种情况下,load_data
也可以接受一个函数,这样您就不需要这样的包。catalogue
帮助您在需要记录传递了哪些函数时。例如,您可能想要记录日志消息或保存配置,以便稍后加载对象。使用 catalogue
,您的函数可以通过字符串进行参数化,这样日志记录和序列化仍然很容易 - 同时仍然提供完整的可扩展性。
我如何确保所有注册装饰器都已运行?
装饰器通常在导入模块时运行。依赖这种副作用有时会导致混淆,尤其是在没有其他原因导入模块的情况下。一种解决方案是使用 入口点。
例如,在 spaCy 中,我们开始使用功能注册表来使管道组件更加可定制。假设用户 Jo 开发了一个更好的标签模型,使用了新的机器学习研究。Jo 的包的最终用户应该能够编写 spacy.load("jo_tagging_model")
。他们不需要记住先导入 jos_tagged_model
,只是为了作为副作用运行功能注册表。使用入口点,注册发生在安装时 - 因此您不需要依赖导入副作用。
🎛 API
函数 catalogue.create
为给定的命名空间创建一个新的注册表。返回一个设置函数,可以用作装饰器或通过名称和 func
关键字参数调用。如果设置 entry_points=True
,则注册表将检查给定命名空间声明的 Python 入口点,例如命名空间 "spacy", "architectures"
的入口点组 spacy_architectures
,在 Registry.get
和 Registry.get_all
中。这允许其他包自动注册函数。
参数 | 类型 | 描述 |
---|---|---|
*namespace |
str | 命名空间,例如 "spacy" 或 "spacy", "architectures" 。 |
entry_points |
bool | 是否检查给定命名空间的入口点并预先填充全局注册表。 |
返回 | Registry |
带有注册和检索函数的方法的 Registry 对象。 |
architectures = catalogue.create("spacy", "architectures")
# Use as decorator
@architectures.register("custom_architecture")
def custom_architecture():
pass
# Use as regular function
architectures.register("custom_architecture", func=custom_architecture)
类 Registry
可以用于注册和检索函数的注册表对象。它通常在调用 catalogue.create
时内部创建。
方法 Registry.__init__
初始化一个新的注册表。如果设置了 entry_points=True
,注册表将检查给定命名空间中声明的 Python 入口点,例如,对于命名空间 "spacy", "architectures"
的入口点组 spacy_architectures
,在 Registry.get
和 Registry.get_all
中。
参数 | 类型 | 描述 |
---|---|---|
namespace |
元组[str] | 命名空间,例如 "spacy" 或 "spacy", "architectures" 。 |
entry_points |
bool | 是否在 get 和 get_all 中检查给定命名空间的入口点。 |
返回 | Registry |
新创建的对象。 |
# User-facing API
architectures = catalogue.create("spacy", "architectures")
# Internal API
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 |
任何 | 可选的注册函数(如果不用作装饰器)。 |
返回 | 可调用对象 | 接受一个参数,即名称的装饰器。 |
architectures = catalogue.create("spacy", "architectures")
# Use as decorator
@architectures.register("custom_architecture")
def custom_architecture():
pass
# Use as regular function
architectures.register("custom_architecture", func=custom_architecture)
方法 Registry.get
获取命名空间中注册的函数。
参数 | 类型 | 描述 |
---|---|---|
name |
str | 名称。 |
返回 | 任何 | 注册的函数。 |
custom_architecture = architectures.get("custom_architecture")
方法 Registry.get_all
获取注册表中命名空间中的所有函数。
参数 | 类型 | 描述 |
---|---|---|
返回 | 字典[str, Any] | 注册的函数,按名称键。 |
all_architectures = architectures.get_all()
# {"custom_architecture": <custom_architecture>}
方法 Registry.get_entry_points
获取为该命名空间从其他包注册的入口点。入口点组的名称是命名空间通过 _
连接。
参数 | 类型 | 描述 |
---|---|---|
返回 | 字典[str, Any] | 加载的入口点,按名称键。 |
architectures = catalogue.create("spacy", "architectures", entry_points=True)
# Will get all entry points of the group "spacy_architectures"
all_entry_points = architectures.get_entry_points()
方法 Registry.get_entry_point
检查注册的入口点是否在命名空间中给定名称可用,并加载它。否则,返回默认值。
参数 | 类型 | 描述 |
---|---|---|
name |
str | 要加载的入口点的名称。 |
default |
任何 | 要返回的默认值。默认为 None 。 |
返回 | 任何 | 加载的入口点或默认值。 |
architectures = catalogue.create("spacy", "architectures", entry_points=True)
# Will get entry point "custom_architecture" of the group "spacy_architectures"
custom_architecture = architectures.get_entry_point("custom_architecture")
方法 Registry.find
查找关于注册函数的信息,包括定义它的模块和文件路径、行号以及可选的文档字符串。
参数 | 类型 | 描述 |
---|---|---|
name |
str | 注册函数的名称。 |
返回 | 字典[str, Union[str, int]] | 关于函数的信息。 |
import catalogue
architectures = catalogue.create("spacy", "architectures", entry_points=True)
@architectures("my_architecture")
def my_architecture():
"""This is an architecture"""
pass
info = architectures.find("my_architecture")
# {'module': 'your_package.architectures',
# 'file': '/path/to/your_package/architectures.py',
# 'line_no': 5,
# 'docstring': 'This is an architecture'}
函数 catalogue.check_exists
检查命名空间是否存在。
参数 | 类型 | 描述 |
---|---|---|
*namespace |
str | 命名空间,例如 "spacy" 或 "spacy", "architectures" 。 |
返回 | bool | 命名空间是否存在。 |
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。
源分发
构建的发行版
catalogue-2.0.10.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4f56daa940913d3f09d589c191c74e5a6d51762b3a9e37dd53b7437afd6cda15 |
|
MD5 | c7f2d1babd56156fadc071558791c483 |
|
BLAKE2b-256 | 38b4244d58127e1cdf04cf2dc7d9566f0d24ef01d5ce21811bab088ecc62b5ea |
catalogue-2.0.10-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 58c2de0020aa90f4a2da7dfad161bf7b3b054c86a5f09fcedc0b2b740c109a9f |
|
MD5 | ee30fc462b57aa308ef07385806070df |
|
BLAKE2b-256 | 9e96d32b941a501ab566a16358d68b6eb4e4acc373fab3c3c4d7d9e649f7b4bb |