如何使用协程和闭包?

How do I use a coroutine a a closure?

提问人:Asgard 提问时间:2/14/2023 更新时间:2/14/2023 访问量:76

问:

我正在制作一个播放音乐的 Discord 机器人,并在网上找到了以下代码(已被我修改):

async def play(self, inter: disnake.CmdInter, url):
    """Plays a song from a given YouTube URL."""

    async with inter.channel.typing():
        self.queue.append([inter.channel, url])
        player = await YTDLSource.from_url(
            url, loop=self.bot.loop, stream=True
        )
        try:
            self.bot.voice_clients[0].play(
                player,
                after=...
            )
        except disnake.errors.ClientException:  # Already playing a song
            self.queue.append([inter.channel, url])
            await inter.send(
                f"Added `{player.title}` to queue "
                f"(Nr. {self.queue.index([inter.channel, url]) + 1})"
            )
            return
    await inter.send(f"Now playing: `{player.title}`")

kwarg 允许我指定在播放停止后执行的闭包。为了添加一个队列系统,我想让 lead 一个函数以递归方式播放队列中的下一首歌曲,直到队列为空。afterafter

我的问题是我无法弄清楚如何使用协程的闭包(递归函数必须如此,因为播放需要使用协程)。、、 和其他一些组合不起作用,我在互联网上没有找到任何关于协程闭包的信息。after=await fooafter=fooafter=lambda: await fooafter=lambda: foo

也许他们只是不是那样工作的,我不熟悉异步编程,所以我不知道。

python async-await 闭包 协程

评论

0赞 relent95 2/14/2023
目前尚不清楚。您需要提供最小的可重现示例和调试详细信息。你用的是“discord.py”吗?然后看看这个
0赞 Asgard 2/14/2023
@relent95我正在使用 Disnake,但尽管如此,您链接的文章似乎解决了我的问题,我稍后会尝试一下。

答: 暂无答案