python将结果限制为一个实例(发送不和谐嵌入)

Posted

技术标签:

【中文标题】python将结果限制为一个实例(发送不和谐嵌入)【英文标题】:python limit results to one instance (sending discord embed) 【发布时间】:2022-01-01 10:01:37 【问题描述】:

所以我正在研究一个不和谐的机器人命令,它接受一个 arg,搜索一个数据库,然后从 API 请求信息并在嵌入中返回信息。该命令应返回三个嵌入之一。一种是数据库中的完全匹配,一种是数据库中的部分匹配,一种是不匹配的结果。

完全匹配,没有匹配按预期工作。部分匹配有效,但是它将发送每个项目的嵌入,即如果您请求“安全”,它将返回(并发送嵌入)安全、安全靴、安全眼镜、安全背心等的结果,

因为这不仅使频道混乱,而且部分匹配嵌入已经列出了这些项目并建议用户更具体,这是多余的。

我相信这与条件语句有关,但无法完全弄清楚。以下代码的清理版本,如果您需要其他任何内容,请告诉我,这已经困扰了我好几天了。

async def item4(ctx, *, arg,):
 ''' Keep best model so far '''
 matches = itemapi.search_api(arg) #returns either exact match, partial match or no match. works as expected.
 for k in matches:
  cnumber = (len(matches.keys())) #counts number of matches
  if cnumber == 1:
    if cnumber >= 2: 
        continue
    else: 
     #sends discord embed for correct match, works as expected
  elif cnumber >= 2:
    if cnumber == 0: 
      continue
    else:
     # sends discord embed for partial match BUT sends 1 embed for each match, should be 1 embed total
 else:
   if 'cnumber' in locals(): 
       pass
   else: 
    #sends discord embed for no match, works as expected ```

【问题讨论】:

【参考方案1】:

我将假设当找到部分匹配时,matches 中总是有多个项目。您的 for 循环遍历 matchescnumber 中的每个键永远不会改变值。因此,当找到部分匹配项时,cnumber >= 2 将针对每个匹配项计算为 True,并且将运行代码块。解决此问题的最简单方法是在发送嵌入后跳出循环,因为无论如何您都只希望发送 1 个嵌入。

另一个建议,您的 for 循环逻辑可能会更简洁一些。例如在这段代码摘录中:

if cnumber == 1:
    if cnumber >= 2: 
        continue
    else: 
        #sends discord embed for correct match, works as expected

您正在检查是否cnumber == 1,然后检查是否cnumber >= 2,但这在逻辑上是不可能的。 cnumber 不能既等于 1 又大于 2,因此您可以完全删除该代码。你在这里做类似的事情:

elif cnumber >= 2:
    if cnumber == 0: 
      continue
    else:
     # sends discord embed...

cnumber 不能大于 2 等于 0。你可以清理代码,它应该是这样的:

for k in matches:
  cnumber = (len(matches.keys())) #counts number of matches
  if cnumber == 1:
     # sends discord embed for correct match
  elif cnumber >= 2:
     # sends discord embed for partial
     # you can add a break statement after the embed is sent to exit the loop
 else:
   if 'cnumber' in locals(): 
       pass
   else: 
    # sends discord embed for no match

希望这会有所帮助

【讨论】:

以上是关于python将结果限制为一个实例(发送不和谐嵌入)的主要内容,如果未能解决你的问题,请参考以下文章

机器人不发送标签 |不和谐.js

将 mongodb 集合项添加到不和谐嵌入

使用 discord.py 制作一个不和谐的机器人通过嵌入发送图像

显示嵌入中的服务器机器人数量 |不和谐.js

将字段添加到 c# 嵌入式不和谐消息

Discord.py 如何从不和谐消息中读取 int 并将其作为变量发送到嵌入中