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

