discord.py中on_ready触发时报cached_property无id属性该怎么修复?
discord.py on_ready事件触发AttributeError报错解决
错误原因
你代码的核心问题是错误地将commands.Context类本身赋值给了ctx变量,而非使用实际的上下文实例:
- 普通命令运行时,discord.py会自动传入包含当前触发环境(服务器、频道、发送者等)的
Context实例,此时ctx.guild是真实存在的服务器对象,可以正常读取id属性 - 你在
on_ready事件中直接写ctx = commands.Context,此时ctx是类本身不是实例,类上定义的guild是被cached_property装饰的未实例化属性,没有实际服务器数据,访问id就会抛出对应错误 - 此外
on_ready本身是机器人全局启动事件,没有绑定任何特定的服务器、频道触发源,本身不存在默认的上下文对象,不需要强行构造Context使用
解决方法
根据你的使用场景选择对应方案即可:
场景1:需要给机器人已加入的所有服务器初始化nps、nastates值
直接遍历机器人的guilds属性,不需要构造Context:
@commands.Cog.listener() async def on_ready(self): await self.changena() async def changena(self): await self.bot.wait_until_ready() # 遍历所有已加入的服务器初始化配置 for guild in self.bot.guilds: nps[guild.id] = None nastates[guild.id] = 1
场景2:只需要给指定单个服务器初始化值
直接指定目标服务器ID读取即可:
# 替换为你自己的目标服务器ID TARGET_GUILD_ID = 123456789012345678 @commands.Cog.listener() async def on_ready(self): await self.changena() async def changena(self): await self.bot.wait_until_ready() guild = self.bot.get_guild(TARGET_GUILD_ID) # 增加判空,避免服务器未加载、机器人不在该服务器的异常 if guild: nps[guild.id] = None nastates[guild.id] = 1
额外注意
on_ready可能会被discord.py触发多次,建议给初始化逻辑增加执行标记,避免重复覆盖已有数据- 如果机器人后续会加入新服务器,建议额外监听
on_guild_join事件,给新加入的服务器单独初始化对应值,无需重启机器人触发on_ready
内容的提问来源于stack exchange,提问作者Ghosty366
相关产品推荐
相关产品推荐

