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
相关产品推荐
相关产品推荐

