Python开发Discord Bot:@client.event与on_ready作用咨询
discord.py 事件机制核心问题解答
注:你提供的示例代码最后一行
client.run(TOKEN缺少闭合右括号,运行前需要补上),否则会直接抛出语法错误。
@client.event的作用与运行逻辑
- 它是
discord.Client类内置的事件注册装饰器,你可以把它理解成一个挂钩工具:你不需要自己写代码轮询监听Discord的服务端通知,只要用这个装饰器标记你的函数,客户端就会在对应事件发生时自动执行你写的逻辑。 - 完整运行流程:
- 调用
client.run(TOKEN)后,Bot会和Discord官方网关建立WebSocket长连接,持续接收网关推送的全量事件通知,包括连接成功、收到新消息、服务器成员变动等等。 - 被
@client.event装饰的函数,会被自动注册到客户端内部的回调映射表中,映射的键就是你的函数名。 - 每当客户端收到网关推送的事件,就会去映射表里找和事件名匹配的回调函数,丢到异步事件循环里执行。
- 调用
- 常见误区:这个装饰器只做注册动作,不会修改你的函数内部逻辑。如果函数名对但没加这个装饰器,事件触发时函数不会被自动调用。
on_ready的命名规则说明
- 这个函数名是discord.py硬编码的固定事件回调名,不是开发者之间的随意约定。如果你把函数改成别的名字,比如
bot_started,就算加了@client.event装饰器,Bot启动就绪时也不会执行这段代码。 - 所有示例都用这个名字的原因很简单:Discord网关在Bot完成账号校验、拉取完所有可见的服务器/频道/用户缓存、连接状态正式切为可用时,固定派发的就绪事件,在discord.py内部就是和
on_ready这个名字做绑定的,属于库预先定义好的事件接口,开发者直接按固定名字实现逻辑就行,不需要自己做事件名映射。 - 除了
on_ready之外,discord.py所有事件对应的回调函数都是固定命名,比如处理收到消息的on_message、处理新成员加入服务器的on_member_join、处理消息表情反应的on_reaction_add,名字拼写错误就无法触发对应逻辑。
内容的提问来源于stack exchange,提问作者J code
相关产品推荐
相关产品推荐

