Discord机器人开发中SyntaxError: name 'comedy'报错如何解决
你遇到的SyntaxError: name 'comedy' is parameter and global报错,是因为你在update_jokes(comedy)函数中添加了global comedy声明,但comedy同时是该函数的入参,Python不允许同一个变量名在函数内同时作为参数和全局变量使用。
你完全不需要给comedy添加global声明,删掉该声明即可解决这个语法错误。
你最初遇到的「变量comedy在赋值前被引用」报错和全局变量无关,是代码其他位置的变量调用错误导致的。
触发关键词返回随机笑话逻辑错误
原代码中检测到用户发送笑话触发词后,调用random.choice(comedy),但comedy是用户新增单条笑话时的临时变量,不是笑话合集。修复如下:# 首先建议把全局的笑话触发词列表改名,避免和数据库的jokes key混淆 joke_triggers = ["I could use a joke right now", "I want to laugh", "I want to see something funny", "I could use a joke"] # 对应检测逻辑修改 if any(word in msg for word in joke_triggers): joke_list = [] if "jokes" in db.keys(): joke_list = db["jokes"] if not joke_list: await message.channel.send("暂未收录任何笑话,你可以使用+add joke命令提交第一条笑话~") else: await message.channel.send(random.choice(joke_list))触发词列表拼写错误
sad_words中的"Sad"后缺少逗号,导致拼接成了无效值Saddepressed;happy_words中的"Happy"后缺少逗号,拼接成了无效值Happythanks,补上对应逗号即可。+add mm命令逻辑错误
原代码拿到用户输入的鼓励语后,错误传入了全局的starter_encouragements列表到更新函数,会把整个列表当成单条文本存入数据库,修复如下:if msg.startswith('+add mm'): # 修改变量名避免和全局列表重名 encourage_msg = msg.split("+add mm ",1)[1] update_encouragements(encourage_msg) await message.channel.send("New encouraging message added :D")db读取错误
原代码读取鼓励语列表时多写了不必要的.value后缀,Replit数据库直接取值即可,修改为:options = options + db["encouragements"]+del joke命令逻辑错误
原代码中jokes = db[jokes]错误用变量作为数据库key,且最后返回未定义的comedy变量,修复如下:if msg.startswith("+del joke"): jokes = [] if "jokes" in db.keys(): index = int(msg.split("+del joke",1)[1]) delete_jokes(index) jokes = db["jokes"] await message.channel.send(jokes)
内容的提问来源于stack exchange,提问作者Inspire

