使用disnake遇TypeError: 'Command'不可迭代的解决求助
警告功能函数报错解决方案
问题详情
你编写的Discord机器人警告函数,原本用于记录用户警告记录,但运行时触发以下错误:
if member not in warnings: ^^^^^^^^^^^^^^^^^^^^^^ TypeError: argument of type 'Command' is not iterable
原代码如下:
warnings = {} @bot.command() @commands.has_role(1247956039404486720) async def warn(ctx, member: disnake.Member, *, reason: str): if member not in warnings: warnings[member] = [] warnings[member].append((ctx.author, reason, datetime.datetime.now())) await ctx.send(f"{member.mention} has been warned for: {reason}.") log_channel = bot.get_channel(log_channel_id) await log_channel.send(f"{member} has been warned by {ctx.author} for: {reason}.")
问题原因
错误核心是变量名冲突:存储警告记录的warnings字典被意外覆盖成了Command类型的对象(大概率是和你的warn命令对象重名,或是代码中其他地方误赋值),导致无法执行in成员判断操作。
解决方案
1. 重命名警告存储变量
将存储警告的字典变量名从warnings改为不会冲突的名称,比如user_warnings,彻底避免变量名冲突问题。
2. 修正后代码
user_warnings = {} @bot.command() @commands.has_role(1247956039404486720) async def warn(ctx, member: disnake.Member, *, reason: str): if member not in user_warnings: user_warnings[member] = [] user_warnings[member].append((ctx.author, reason, datetime.datetime.now())) await ctx.send(f"{member.mention} has been warned for: {reason}.") log_channel = bot.get_channel(log_channel_id) await log_channel.send(f"{member} has been warned by {ctx.author} for: {reason}.")
3. 额外检查项
- 排查代码其他区域,确保没有将
warnings变量重新赋值给非字典对象 - 若导入了Python标准库的
warnings模块,建议使用别名(如import warnings as py_warnings),进一步规避命名冲突
内容的提问来源于stack exchange,提问作者Den Denji Asarkus
相关产品推荐
相关产品推荐

