新闻详情

新闻详情

首页 / 资讯中心 / 详情

NoneBot2 插件数据模型深度解析:PluginMetadata 与 Plugin 源码级指南

发布时间:2026/9/29 12:12:23来源:尧图网络
NoneBot2 插件数据模型深度解析:PluginMetadata 与 Plugin 源码级指南
后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载NoneBot2 通过nonebot.plugin.model模块定义了插件系统的两大核心数据模型——PluginMetadata插件元信息由插件作者声明与Plugin插件运行时信息由框架在加载时构建。本文以 官方 API 文档 为骨架结合仓库源码与测试用例逐字段讲解两者的含义、格式约定与实际用法帮助你正确编写插件元信息、理解嵌套插件机制并掌握通过id_、module_name等标识在运行时定位插件的能力。模块定位插件信息的两个层面nonebot.plugin.model是 NoneBot2 插件体系的信息模型层它只负责定义数据结构不负责加载逻辑。加载流程由nonebot.plugin.managerPluginManager、PluginFinder、PluginLoader与nonebot.plugin.loadload_plugin、load_plugins等接口完成而本模块中的两个dataclass类则是整个流程的产物容器PluginMetadata作者声明的信息通过模块级变量__plugin_meta__提供给框架Plugin框架构建的信息在模块执行前由PluginLoader创建并挂载为模块属性__plugin__。两者配合构成了 nonebot/plugin/model.py 的完整定义。PluginMetadata插件作者声明的元信息PluginMetadata是一个dataclass(eqFalse)数据类包含 8 个字段与 1 个方法。插件作者通常在插件模块顶部创建其实例并赋值给__plugin_meta__例如仓库测试插件 tests/plugins/metadata.pyfrom pydantic import BaseModel from nonebot.adapters import Adapter from nonebot.plugin import PluginMetadata class Config(BaseModel): custom: str class FakeAdapter(Adapter): ... __plugin_meta__ PluginMetadata( name测试插件, description测试插件元信息, usage无法使用, typeapplication, homepagehttps://nonebot.dev, configConfig, supported_adapters{~onebot.v11, plugins.metadata:FakeAdapter}, extra{author: NoneBot}, )必填字段字段类型说明namestr插件名称descriptionstr插件功能介绍usagestr插件使用方法三个字段均为str且是构造PluginMetadata时必须提供的参数无默认值其余字段均可省略。它们通常会被插件商店、帮助系统等消费用于向用户展示这个插件是什么、怎么用。可选字段字段类型默认值说明typestr \| NoneNone插件类型用于商店分类homepagestr \| NoneNone插件主页configtype[BaseModel] \| NoneNone插件配置项模型pydanticBaseModel子类supported_adaptersset[str] \| NoneNone插件支持的适配器模块路径集合extradict[Any, Any]{}插件额外信息可自由扩展其中extra使用field(default_factorydict)保证每次实例化都得到独立字典避免 dataclass 可变默认值的陷阱。config字段接收一个 pydantic 模型类而非实例配合 get_plugin_config 可以从全局配置中解析出插件专属配置对象。supported_adapters 的格式约定supported_adapters是插件作者声明本插件兼容哪些适配器的集合格式为module[:Adapter]并有两条关键约定~是nonebot.adapters.的缩写如~onebot.v11等价于nonebot.adapters.onebot.v11None即不声明该字段表示支持所有适配器。每条声明可细分为两种形态仅模块路径~onebot.v11此时默认取该模块的Adapter类模块路径 冒号 适配器类名plugins.metadata:FakeAdapter用于指定非默认命名的适配器类。该格式在 nonebot/plugin/model.py 的 docstring 中有明确定义。get_supported_adapters()把字符串解析为适配器类PluginMetadata.get_supported_adapters()是唯一的方法用于获取当前已安装的插件支持适配器类列表返回set[type[Adapter]] | None。其实现nonebot/plugin/model.py逻辑如下def get_supported_adapters(self) - set[Type[Adapter]] | None: if self.supported_adapters is None: return None adapters set() for adapter in self.supported_adapters: with contextlib.suppress(ModuleNotFoundError, AttributeError): adapters.add( resolve_dot_notation(adapter, Adapter, nonebot.adapters.) ) return adapters若supported_adapters为None直接返回None表示全适配器支持否则对集合中每条字符串调用resolve_dot_notation(adapter, Adapter, nonebot.adapters.)即以nonebot.adapters.为默认前缀解析点分割路径并取出名为Adapter的属性使用contextlib.suppress(ModuleNotFoundError, AttributeError)静默跳过适配器未安装或属性不存在的条目——这意味着未安装的适配器会被自动过滤返回的集合只包含当前环境中真实可用的适配器类。从源码结构可以推断该方法的典型使用场景是框架在加载插件后将插件元信息中的适配器声明解析为实际类用于适配器层面的兼容性判断。Plugin框架构建的插件运行时信息Plugin同样是dataclass(eqFalse)但它不是由插件作者创建而是由PluginLoader.exec_module在模块执行前通过_new_plugin构造nonebot/plugin/manager.py# create plugin before executing plugin _new_plugin(self.name, module, self.manager) setattr(module, __plugin__, plugin)随后模块代码执行完毕后框架读取__plugin_meta__并回填到plugin.metadatametadata: PluginMetadata | None getattr(module, __plugin_meta__, None) plugin.metadata metadata因此对插件作者而言Plugin是只读的运行时视图可通过nonebot.get_plugin(plugin_id)、nonebot.get_loaded_plugins()等接口获取见 nonebot/plugin/init.py。字段一览字段类型说明namestr插件名称NoneBot 使用文件/文件夹名称作为插件名称moduleModuleType插件模块对象module_namestr点分割模块路径managerPluginManager导入该插件的插件管理器matcherset[type[Matcher]]插件加载时定义的Matcher集合parent_pluginPlugin \| None父插件嵌套插件场景下非Nonesub_pluginsset[Plugin]子插件集合metadataPluginMetadata \| None插件元信息注意matcher的默认值为field(default_factoryset)。从源码结构看当插件模块顶层代码调用on_command、on_message等注册函数创建 Matcher 时它们会被自动登记到当前插件即_current_plugin上下文变量指向的Plugin的matcher集合中。id_插件的索引标识id_是一个只读propertynonebot/plugin/model.pyproperty def id_(self) - str: return ( f{self.parent_plugin.id_}:{self.name} if self.parent_plugin else self.name )顶层插件id_就是插件名称如export嵌套子插件id_为父插件id:子插件名称如nested:nested_subplugin。该标识是nonebot.get_plugin()等接口的查找键且保证全局唯一——若出现重复_new_plugin会抛出RuntimeError(Plugin ... already exists!)nonebot/plugin/init.py。源码验证嵌套插件与标识解析仓库测试 tests/plugins/nested/init.py 演示了嵌套插件的构建方式父插件plugins.nested通过PluginManager(search_path[...])声明子插件目录随后加载plugins.nested.plugins.nested_subplugin。对应的 tests/test_plugin/test_get.py 验证了标识解析规则plugin.id_ nested:nested_subplugin子插件标识为父插件 id 冒号 子插件名plugin.module_name plugins.nested.plugins.nested_subplugin模块路径保留完整点分割形式get_plugin_by_module_name(plugins.nested.utils)能通过子模块名反查父插件nested——该函数会逐级向上切割模块名进行匹配nonebot/plugin/init.py。另外PluginManager._prepare_plugins会跳过以_开头的模块nonebot/plugin/manager.py仓库中的 tests/plugins/_hidden.py内含pytest.fail(should not be imported)正是用于验证该行为——以_开头的文件不会被当作插件加载。实战要点如何正确编写与读取插件信息声明元信息在插件模块顶层定义__plugin_meta__ PluginMetadata(...)必填name、description、usage需要商店分类时填type需要声明适配器兼容性时填supported_adapters自定义信息放入extra。适配器声明格式~onebot.v11或nonebot.adapters.onebot.v11均可需要指定非默认类名时用module:AdapterClass不声明该字段即代表全适配器支持。运行时取用通过nonebot.get_plugin(插件id)获取Plugin读取.metadata获得作者声明的元信息通过get_loaded_plugins()遍历全部已加载插件get_available_plugin_names()则返回包含未加载插件在内的全部可用标识nonebot/plugin/init.py。嵌套插件注意子插件id_一定带父插件前缀若插件目录结构会嵌套务必用get_plugin时携带完整父:子标识。关联阅读PluginManager 与加载流程理解Plugin的manager字段如何驱动加载PluginMetadata 源码、加载实现、加载接口适配器基类 Adapterget_supported_adapters()返回值所引用的类型Matcher 定义Plugin.matcher集合中的元素类型赞分享后端即时通讯【免费下载链接】nonebot2跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python项目地址https://gitcode.com/gh_mirrors/no/nonebot2点击查看免费下载相关推荐NoneBot2 插件数据库开发指南使用 nonebot-plugin-orm 实现模型、迁移与依赖注入NoneBot2 插件数据库开发指南使用 nonebot plugin orm 实现模型、迁移与依赖注入 本篇指南围绕 NoneBot2 生态中的数据库支持插后端即时通讯Omi Plugin SDK 深度解析Omi 插件 Webhook 数据模型的 Python 共享层Omi Plugin SDK 深度解析Omi 插件 Webhook 数据模型的 Python 共享层 导读 omi plugin sdk 是 Omi 开源仓库人工智能AI 应用语音移动开发后端桌面应用智能硬件MCP 服务30分钟上手GPTeam多智能体协作模拟的终极入门教程30分钟上手GPTeam多智能体协作模拟的终极入门教程 GPTeamGitHub 加速计划是一个开源的多智能体模拟系统它利用GPT 4创建多个智能体通上一篇Wand-Enhancer 免费完整指南解锁Pro功能与手机远程操控设置下一篇纸质文档一键变电子档OpenNoteScanner自动边缘检测与透视校正技术揭秘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

python,pycharm,模块,虚拟环境,快速迁移模块杂谈 2026/9/29 12:12:16

python,pycharm,模块,虚拟环境,快速迁移模块杂谈

在刚开始使用的阶段, 倘若使用者对官方所提供的那一套集成开发环境感到不适应, 那么便需要亲自去搜寻并确定一款更为合适的集成开发环境来使用, 例如像某些特定的软件选项那样。可是, 由于它动不动就要占用好7-10G的存储空间, 那点儿小的C盘实在难以承受这份重量。而在市面上被…

阅读更多 →
从REST到gRPC,一个API选型的思考框架 2026/9/29 12:12:16

从REST到gRPC,一个API选型的思考框架

当团队里的人在搞微服务架构时, 他们就会发现, 不同服务之间的联系该怎么处理, 这个事儿是必须去面对的, 躲都躲不掉。REST加上JSON这种技术组合, 已经使用了非常长的时间, 它简单成熟, 而且调试起来非常方便, gRPC现在也很受大家的欢迎, 它的性能很好, 类型安全, 代码生成的这…

阅读更多 →
用Python编写运行 Hello World程序 2026/9/29 12:12:10

用Python编写运行 Hello World程序

简介接下来, 我们将仔细看看去编写并运行一个经典的“Hello World”程序的具体过程。通过这个实际操作环节, 你将有能力逐步掌握编写代码、保存文件以及执行程序的一系列具体方法。存在两种用来运行程序的途径, 第一种是使用那个带有提示符的交互式解释器,第二种是利…

阅读更多 →
MIPI D-PHY LP-RX低功耗接收机制全解析:电平阈值与调试实践 2026/9/29 12:12:03

MIPI D-PHY LP-RX低功耗接收机制全解析:电平阈值与调试实践

前阵子帮客户调一块MIPI DSI接口的工业屏,驱动IC是ST7701S,上电之后背光亮了,屏幕却一直黑着。示波器接在数据和时钟线上,看到的不是想象中高速差分波形,而是一堆接近1.2V的直流电平。后来才发现,真正卡住我…

阅读更多 →
STM32+HX711电子秤量产级设计:信号链建模与抗干扰闭环实现 2026/9/29 12:11:57

STM32+HX711电子秤量产级设计:信号链建模与抗干扰闭环实现

1. 这不是“又一个STM32称重Demo”,而是一套能直接上产线的完整闭环方案你搜“STM32 HX711 OLED”出来的,十有八九是那种:接上线、烧个例程、屏幕上跳几个数字、然后就没了的“教学演示”。我做过三轮工业级电子秤项目,从给宠物粮…

阅读更多 →
中山喷涂生产线专业制造商选购参考汇总:自动化涂装设备源头厂家实力公司推荐 2026/9/29 12:11:50

中山喷涂生产线专业制造商选购参考汇总:自动化涂装设备源头厂家实力公司推荐

工业涂装产线选购必知:核心原理与基础逻辑在五金、铝型材、家电等制造行业的生产流程中,喷涂工序是决定产品外观品质与环保合规性的核心环节之一。不同于简单的手工喷涂,标准化的自动化喷涂生产线需要整合喷漆室、输送系统、烘干模块、废气治…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉