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 循环遍历 matches
和 cnumber
中的每个键永远不会改变值。因此,当找到部分匹配项时,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将结果限制为一个实例(发送不和谐嵌入)的主要内容,如果未能解决你的问题,请参考以下文章