Discord.py加载Cogs时出现NoneType不可用于await表达式错误
问题分析与解决
错误根源
- Intents 配置位置错误:你把
intents配置放在了Cog的__init__方法里,这完全无效。Discord Bot的intents必须在创建Bot实例时传入,而非在Cog内部设置。 - Setup函数冗余语法:
Test(client, )中的逗号属于冗余写法,虽不直接报错,但会影响代码可读性。 - Bot实例未正确初始化:从你描述的“此前的intents错误”来看,
main.py中大概率没有在创建Bot时传入intents,这会导致Bot实例核心属性缺失,进而触发加载扩展时的NoneType错误。
修正步骤
1. 修正main.py的Bot初始化
在main.py中添加Bot实例的正确初始化代码,确保传入intents:
import os import discord import asyncio from discord.ext import commands # 初始化intents intents = discord.Intents.default() intents.message_content = True # 必须开启此intent才能读取消息内容 # 创建Bot实例,替换为你的命令前缀 bot = commands.Bot(command_prefix="!", intents=intents) # 原有加载扩展代码 async def load_extensions(): for filename in os.listdir("./cogs"): if filename.endswith(".py"): await bot.load_extension(f"cogs.{filename[:-3]}") async def main(): async with bot: await load_extensions() await bot.start(os.getenv('TOKEN')) asyncio.run(main())
2. 修正cogs.py的代码
移除Cog内部无效的intents配置,同时清理setup函数的冗余语法:
import discord from discord.ext import commands class Test(commands.Cog): def __init__(self, client): self.client = client # 仅保留client引用即可 @commands.command() async def command(self, ctx): await ctx.send("Yes?") def setup(client): client.add_cog(Test(client)) # 移除多余的逗号
3. 补充验证步骤
- 登录Discord开发者后台,在Bot选项卡的
Privileged Gateway Intents下开启Message Content Intent。 - 确认
.env文件中的TOKEN环境变量配置正确。
错误解释
当你在Cog内部设置self.intents时,Bot实例本身并未获得正确的intents配置,导致其内部部分核心方法返回None,而这些方法被用于await表达式中,最终触发TypeError: object NoneType can't be used in 'await' expression错误。将intents移至Bot初始化步骤后,Bot实例才能正常工作,扩展加载也不会出错。
内容的提问来源于stack exchange,提问作者CompressedSquid
相关产品推荐
相关产品推荐

