Discord机器人partial match embed重复发送 如何限制仅输出1条实例
问题根因
你把embed发送逻辑写在了遍历matches的循环体内部,当匹配数量大于等于2时,每遍历一个匹配项都会触发一次发送逻辑,自然就会生成和匹配条目数量一致的重复embed。另外你现有代码里还有大量冗余无效的条件判断,比如先判断cnumber == 1之后又判断cnumber >=2,两个条件完全互斥,内部的continue永远不会触发。
修复方案
先在循环外统计匹配总数,根据总数分支处理不同场景,仅在需要构造部分匹配列表的时候遍历所有匹配项:
async def item4(ctx, *, arg,): ''' Keep best model so far ''' matches = itemapi.search_api(arg) cnumber = len(matches.keys()) # 无匹配场景 if cnumber == 0: # 原无匹配embed发送逻辑放这里 return # 完全匹配场景 if cnumber == 1: # 取唯一的匹配项构造embed match_item = list(matches.values())[0] # 原完全匹配embed发送逻辑放这里 return # 部分匹配场景 # 遍历所有匹配项拼接内容到同一个embed embed_content = [] for k in matches: # 把每个匹配项的展示内容加到列表里,可根据实际字段调整展示格式 embed_content.append(f"- {matches[k].get('name', k)}") # 构造统一的部分匹配embed,只发送一次 partial_embed = discord.Embed( title="找到多个匹配结果", description="\n".join(embed_content) + "\n\n请细化搜索条件缩小范围" ) await ctx.send(embed=partial_embed)
注意事项
- 不需要把所有逻辑都塞到同一个循环里,根据匹配数提前分支可以大幅减少逻辑冗余
- 部分匹配场景仅需要遍历一次所有匹配项来收集展示内容,收集完成后统一发送一次即可,不要在遍历过程中执行发送操作
内容的提问来源于stack exchange,提问作者Bruce Taylor
相关产品推荐
相关产品推荐

