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

Python字典嵌套列表取值报错:Discord机器人KeyError问题

解决Py-Cord Discord机器人的KeyError问题

问题根源

  • 键类型不匹配:存储权重配置时将guild.id转为字符串作为字典键,但测试命令中直接用整数类型的guild.id取值,类型不匹配导致找不到对应键。
  • 键未预初始化:仅在setvalues命令中为字典添加对应guild的键,若先执行测试命令,目标guild的键还未被创建,触发KeyError。

解决方案

1. 统一键的类型

Discord服务器ID本身是整数类型,建议全程使用整数作为字典键,避免类型转换带来的错误:

# 初始化空字典
weights = {}

@bot.command()
async def setvalues(ctx, *args):
    # 直接用整数guild ID作为键
    weights[ctx.guild.id] = list(map(float, args))

2. 自动初始化默认值

使用collections.defaultdict为未设置过的guild自动生成默认权重值,避免键不存在的问题:

from collections import defaultdict

# 初始化默认值为你需要的默认权重列表(示例为两个0.0的权重)
weights = defaultdict(lambda: [0.0, 0.0])

@bot.command()
async def test(ctx):
    # 直接获取,不存在则自动使用默认值
    current_weights = weights[ctx.guild.id]
    # 后续调用OpenAI API的逻辑
    await ctx.send(f"当前服务器权重配置:{current_weights}")

备选方案:手动检查初始化

如果不想使用defaultdict,可以在测试命令中手动检查并初始化键:

weights = {}

@bot.command()
async def test(ctx):
    guild_id = ctx.guild.id
    # 检查键是否存在,不存在则设置默认值
    if guild_id not in weights:
        weights[guild_id] = [0.0, 0.0]  # 根据你的需求定义默认权重
    current_weights = weights[guild_id]
    # 后续业务逻辑

额外提示

如果需要机器人重启后保留权重配置,可将字典数据持久化到JSON文件或数据库:

  • 存储到JSON时,由于JSON仅支持字符串键,写入时需将整数ID转为字符串,读取后再转回整数:
import json

# 保存配置
def save_weights():
    # 转换键为字符串
    str_key_weights = {str(k): v for k, v in weights.items()}
    with open("weights.json", "w") as f:
        json.dump(str_key_weights, f)

# 加载配置
def load_weights():
    try:
        with open("weights.json", "r") as f:
            str_key_weights = json.load(f)
            # 转换键回整数
            return {int(k): v for k, v in str_key_weights.items()}
    except FileNotFoundError:
        return {}

# 机器人启动时加载配置
weights = load_weights()

内容的提问来源于stack exchange,提问作者Liam McMillen-Meyers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:10:36