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

discord.py开发Discord机器人时log调用.append()报AttributeError错误

问题原因

你遇到的AttributeError: 'Command' object has no attribute 'append'报错,核心原因是你定义的全局log列表被discord.py的命令对象覆盖了:
discord.py使用@client.command()装饰器注册命令时,会自动将命令实例赋值给和命令同名的全局变量。只要你的代码里存在一个名为log的命令(不管是你自己定义的@client.command() async def log(...),还是引入的第三方扩展注册了log命令),就会覆盖你提前声明的log = ["Spam Log :"]列表变量,导致你调用log.append()时实际操作的是Command对象而非列表。

解决方案

任选一种即可:

  • 重命名你的日志列表变量,避开log这个命令名,比如改成spam_log,修改后代码示例:
global spam_log
spam_log = ["Spam Log :"]

@client.command()
async def spam(ctx, speed=None, *text):
  global spam_log
  spam_log.append(f"{text} - Spammed By {ctx.author} at {speed} speed.")
  # 剩下的原有逻辑保持不变
  • 将日志变量挂载到client实例上存储,避免全局变量冲突:
# 初始化时直接赋值给client属性
client.spam_log = ["Spam Log :"]

@client.command()
async def spam(ctx, speed=None, *text):
  # 不需要声明global,直接调用client属性即可
  client.spam_log.append(f"{text} - Spammed By {ctx.author} at {speed} speed.")
  # 剩下的原有逻辑保持不变
  • 如果你确实需要保留log作为命令名,可以给命令显式指定name参数,避免函数名和全局变量冲突:
@client.command(name="log")
async def log_command(ctx):
  # 命令逻辑写在这里

额外优化建议

你现有代码存在几个可优化点:

  • 不要使用裸except,可以指定捕获ValueError等具体异常,避免吞掉无关报错增加调试难度
  • 错误提示里的accured是拼写错误,正确拼写为occurred
  • import asyncio建议放到代码顶部,不要写在命令逻辑内部

内容的提问来源于stack exchange,提问作者MenIndo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:45:03