問題描述
基本上我正在做一個(gè)測驗(yàn),我希望能夠搜索答案并確定哪條消息只包含藝術(shù)家,哪條消息只包含歌曲名稱,以及哪條消息同時(shí)顯示它們.我已經(jīng)制作了 3 個(gè)檢查函數(shù)來顯示這一點(diǎn),但是我希望所有 3 個(gè) wait_for_message 語句并排運(yùn)行.關(guān)于如何解決這個(gè)問題的任何想法?
Basically I am making a quiz and I want to be able to search through the answers and determine which message only has the artist in, which message only has the song name in, and which message says them both. I've made 3 check functions to show this however I want all 3 wait_for_message statements to run side by side. Any ideas on how this could be remedied?
await client.say("What is the song name and artist?")
def check1(msg):
return name in msg.content.upper() and artist not in msg.content.upper()
def check2(msg):
return artist in msg.content.upper() and name not in msg.content.upper()
def check3(msg):
return name in msg.content.upper() and artist in msg.content.upper()
msg1 = await client.wait_for_message(timeout=10, check=check1)
msg2 = await client.wait_for_message(timeout=10, check=check2)
msg3 = await client.wait_for_message(timeout=20, check=check3)
if msg3 is not None:
await client.say("@{} got both of them right! It was indeed {} by {}".format(msg3.author, toString(name),
toString(artist)))
elif msg1 is not None and msg2 is not None:
await client.say("@{} got the song name and @{} got the artist name! It was indeed {} by {}".format(msg1.author,
msg2.author, toString(name), toString(artist)))
elif msg1 is not None and msg2 is None:
await client.say("@{} got the song name but no one got the artist! It was {} by {}".format(msg1.author,
toString(name), toString(artist)))
elif msg1 is None and msg2 is not None:
await client.say("@{} got the artist name but no one got the song name! It was {} by {}".format(msg2.author,
toString(name), toString(artist)))
elif msg1 is None and msg2 is None and msg3 is None:
await client.say("No one got it! It was {} by {}! Better luck next time".format(toString(name), toString(artist)))
推薦答案
你要找的代碼是asyncio.gather
.這讓您可以同時(shí)運(yùn)行多個(gè)協(xié)程并等待所有方法返回.
The code you are looking for is asyncio.gather
. This lets you run multiple coroutines at the same time and wait until all methods are returned.
gather 的返回列表是按照輸入的順序,而不是按照任務(wù)完成的順序.
The return list from gather is in the order of the inputs, not in the order of task completion.
ret = await asyncio.gather(
client.wait_for_message(timeout=10, check=check1),
client.wait_for_message(timeout=10, check=check2),
client.wait_for_message(timeout=10, check=check3)
)
msg1, msg2, msg3 = *ret
# msg1 has the name
# msg2 has the artist
# msg3 has both
由于 discord.py 的重寫版本有 client.wait_for
拋出錯(cuò)誤而不是返回 None,你可以這樣做.
Since the rewrite version of discord.py has client.wait_for
throw an error instead of returning None, you can instead do this.
ret = await asyncio.gather(
client.wait_for("message", timeout=10, check=check1),
client.wait_for("message", timeout=10, check=check2),
client.wait_for("message", timeout=10, check=check3),
return_exceptions = True
)
# Test for errors
ret = [r if not isinstance(r, Exception) else None for r in ret]
msg1, msg2, msg3 = *ret
這篇關(guān)于需要多個(gè) wait_for_messages discord.py的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!