Discord bot命令开发:列表推导式处理别名参数报错求助
问题核心原因
你的代码逻辑仅适配了「手动输入的数组被discord.py拆分为多个独立参数」的场景:
- 手动输入
[72, 1, .1, ...]时,*args会将其拆分为["[72,", "1,", ".1]", ...]多个独立参数,原有逻辑逐参数提取数值、遇到带]的参数就闭合集合,逻辑可以正常运行 - 当使用
g.basic/g.factory别名时,lookup返回的是一整个完整的数组字符串(同时包含[和]),原有逻辑会直接对整个字符串提取数字和点,把所有数值拼接成类似18.251.4.112.214.5的无效字符串,转float时直接抛出错误
修复逻辑
- 遍历每个参数时先判断是否为完整的数组字符串(同时包含
[和]) - 完整数组字符串直接按逗号分割,逐个提取数值组成独立集合加入sets
- 非完整数组字符串沿用原有逻辑逐参数收集数值,遇到闭合符
]就存入sets - 新增集合长度校验,避免不同长度的数组相乘出现下标越界错误
修复后完整代码
@client.command() async def bot(ctx, *args): if ctx.channel.id != 850828323135160341: return lookup = { "g.basic": "[18.25, 1.4, .1, 1, 2, .2, 1, 4.5, 1, 1, 1, 15, 1]", "g.factory": "[72, 1, .1, .7, 2, .2, 1, 3, 1, 1, 1, .1, 1]" } new_args = [lookup.get(arg, arg) for arg in args] sets = [] # 存储所有找到的数组集合 subset = [] # 每个括号包裹的数组称为一个set for arg in new_args: # 新增判断:当前参数是完整的数组字符串 if '[' in arg and ']' in arg: # 按逗号分割数组元素 elements = arg.strip('[]').split(',') full_subset = [] for ele in elements: # 提取每个元素的数值部分 num_str = ''.join([car for car in ele if car.isnumeric() or car == '.']) full_subset.append(float(num_str)) sets.append(full_subset) continue # 原有逻辑处理拆分后的数组参数 num_str = ''.join([car for car in arg if car.isnumeric() or car == '.']) subset.append(float(num_str)) if ']' in arg: # 数组闭合 sets.append(subset) subset = [] # 重置存储下一个集合 # 新增校验:所有数组长度必须一致 arr_len = len(sets[0]) for s in sets: if len(s) != arr_len: embed=discord.Embed(title="g.stats helper", description=f":x: - 错误:输入的数组长度不一致", color=0xFF4444) await ctx.send(embed=embed) return # 原有计算逻辑不变 output = [*sets[0]] # 取第一个集合的数值作为初始值 for s in sets[1:]: # 遍历其余所有集合 for i in range(len(s)): output[i] *= s[i] # 对应位置数值相乘 embed=discord.Embed(title="g.stats helper", description=f":white_check_mark: - 以下是生成的自定义g.stat:\n\n **{output}**", color=0x77AC54) channel = client.get_channel(850806578125864981) await channel.send(embed=embed)
代码修改说明
- 新增完整数组字符串判断分支,专门处理别名替换后的完整数组,避免整个字符串提取数值的错误
- 新增数组长度校验,提前拦截非法输入避免下标越界错误
- 原有手动输入数组的逻辑完全保留,不会影响原有使用方式
内容的提问来源于stack exchange,提问作者Nightly
相关产品推荐
相关产品推荐

