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

使用Discord.py开发机器人遇UnboundLocalError及NameError问题求助

解决Discord机器人翻译命令的变量错误问题

我来帮你搞定这个问题,你遇到的UnboundLocalError和NameError都是因为全局变量Spanish的定义与使用逻辑出了问题,咱们一步步梳理修复:

1. 错误根源拆解

  • UnboundLocalError:一开始你没声明global Spanish,当函数里尝试修改这个变量时,Python会默认把它当成局部变量,但你在赋值前就引用了它(比如if message.author.id in Spanish),因此触发未绑定局部变量的错误。
  • NameError:后来你加了global Spanish,但全局范围内根本没初始化这个变量——只有用户触发P$LANG命令时才会定义Spanish = [],如果用户先触发P$POLLHELP,Spanish还不存在,自然会报变量未定义的错误。

2. 修复后的完整代码

首先要在所有函数外部提前初始化全局变量,然后在需要修改它的函数里正确声明global:

# 在代码最外层初始化全局变量,确保程序启动时就存在
Spanish = []

# 假设这是你的消息处理函数(比如on_message)
@client.event
async def on_message(message):
    channel = message.channel
    author = message.author
    
    if message.content.upper().startswith("P$LANG"):
        lang = message.content[7:].strip()  # 加strip()去除输入前后的空格,避免判断失效
        # 声明要使用全局变量Spanish(修改全局变量时必须声明)
        global Spanish
        # 简化判断逻辑,用列表包含所有匹配项
        if lang.upper() in ["SPANISH", "SPAIN", "ESPAÑOL"]:
            # 用f-string优化字符串拼接,更简洁易读
            xcm = f"<@!{message.author.id}> Ahora Phantom estará en Español. Ten en cuenta que los comandos seguiran siendo en Inglés, solo que la respuesta será en Español."
            # 先检查用户ID是否已在列表中,避免重复添加
            if message.author.id not in Spanish:
                Spanish.append(message.author.id)
            await channel.send(xcm)  # 用channel.send替代旧版的client.send_message

    if message.content.upper().startswith('P$POLLHELP'):
        # 这里只是读取变量,不需要声明global
        if message.author.id in Spanish:
            await channel.send(
                "**Uso:** P$~<x>poll <pregunta> | reemplaza <x> con el número, min - 1 || máx - 5 |-|-| reemplaza <pregunta> con tu pregunta.*"
            )
        else:
            await channel.send(
                "**Usage:** P$~<x>poll <question> | replace the <x> with the number, min - 1 || max - 5 |-|-| replace <question> with your question.*"
            )
        print(f"P$pollhelp was used by {author.name}")

3. 关键修复点说明

  • 全局变量提前初始化:在代码最外层定义Spanish = [],确保程序启动时该变量就存在,彻底避免NameError。
  • 合理使用global声明:只有在需要修改全局变量的代码块(比如P$LANG命令里的append操作)才需要声明global Spanish,仅读取变量时无需声明。
  • 避免重复添加ID:添加用户ID前先做存在性检查,防止列表中出现重复的用户ID。
  • 优化代码细节:用f-string替代老式字符串拼接,添加strip()处理输入空格,让代码更健壮易读。

这样修改后,用户输入P$LANG SPANISH时,ID会被正确加入Spanish列表,触发P$POLLHELP时也会根据语言设置返回对应提示,不会再出现变量相关的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:27:42