You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:00:01