You need to enable JavaScript to run this app. Discord bot命令开发:列表推导式处理别名参数报错求助
优惠活动
大模型
产品
解决方案
定价
更多

Discord bot命令开发:列表推导式处理别名参数报错求助

问题核心原因

你的代码逻辑仅适配了「手动输入的数组被discord.py拆分为多个独立参数」的场景:

  • 手动输入[72, 1, .1, ...]时,*args会将其拆分为["[72,", "1,", ".1]", ...]多个独立参数,原有逻辑逐参数提取数值、遇到带]的参数就闭合集合,逻辑可以正常运行
  • 当使用g.basic/g.factory别名时,lookup返回的是一整个完整的数组字符串(同时包含[和]),原有逻辑会直接对整个字符串提取数字和点,把所有数值拼接成类似18.251.4.112.214.5的无效字符串,转float时直接抛出错误
修复逻辑
  1. 遍历每个参数时先判断是否为完整的数组字符串(同时包含[和])
  2. 完整数组字符串直接按逗号分割,逐个提取数值组成独立集合加入sets
  3. 非完整数组字符串沿用原有逻辑逐参数收集数值,遇到闭合符]就存入sets
  4. 新增集合长度校验,避免不同长度的数组相乘出现下标越界错误
修复后完整代码
@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 04:36:04