Python Discord机器人开发出现AttributeError: 'bool'无append属性报错求解
报错原因
你遇到的AttributeError: 'bool' object has no attribute 'append'报错,核心是db["encouragements"]原本是存储鼓励语句的列表,被错误覆盖为了布尔值,布尔类型没有append方法所以调用失败。
问题根源
错误来自你写的!responding命令处理逻辑,存在两处致命错误:
- 参数提取错误:
msg.split("!responding ",1)[0]取到的是命令前缀本身,而非用户输入的true/false参数,应该取拆分结果的索引1位置 - 存储键错误:你将控制响应开关的布尔值,错误存入了
db["encouragements"]键中,直接覆盖了原本存鼓励语句的列表
修复方案
1. 修正!responding命令逻辑
将原代码中!responding对应的代码段替换为以下内容:
if msg.startswith("!responding"): # 取拆分后的第二个元素,也就是用户输入的true/false参数 value = msg.split("!responding ",1)[1] if value.lower() == "true": # 赋值给正确的开关键responding,不要覆盖encouragements db["responding"] = True await message.channel.send("Responding is on.") else: db["responding"] = False await message.channel.send("Responding is off.")
2. 修复附带的列表拼接错误
你在拼接鼓励语句候选池时,错误将列表转成了字符串拼接,会导致后续随机选择逻辑异常,对应逻辑修改为:
if db["responding"]: options = starter_encouragements.copy() if "encouragements" in db.keys(): # 用extend拼接两个列表,不要转字符串 options.extend(db["encouragements"])
3. 清理现有脏数据
因为当前你的数据库中encouragements已经被覆盖为布尔值,需要先清理脏数据,可以在初始化部分(if "responding" not in db.keys()代码段后面)添加以下逻辑:
# 检查encouragements类型是否合法,不合法就删除脏数据 if "encouragements" in db.keys() and not isinstance(db["encouragements"], list): del db["encouragements"]
内容的提问来源于stack exchange,提问作者João Pedro da Silva
相关产品推荐
相关产品推荐

