Python如何在lambda中使用await

时间:2019-09-27 16:26:24

标签: python lambda async-await python-asyncio

我要对lambda函数使用“ await”,如下所示。

self.voice_channel.play(discord.FFmpegPCMAudio('music.mp3'), after=lambda e: await self.test(x))

SyntaxError: 'await' outside async function

如何修复它,使其具有这种感觉?

2 个答案:

答案 0 :(得分:2)

我认为没有办法使lambda异步,但是您可以执行以下操作:

async def temp():
    await self.test(x)

self.voice_channel.play(discord.FFmpegPCMAudio('music.mp3'), after = temp)

答案 1 :(得分:1)

正如另一个答案所说,您不能将await放在lambda中。但是,如果await是表达式中最外面的运算符,则可以省略async和await,并让lambda直接返回awaitable:

self.voice_channel.play(discord.FFmpegPCMAudio('music.mp3'),
                        after=lambda e: self.test(x))

在没有await的情况下,lambda仅返回self.test(x)。因为要等待该值,所以self.test(x)必须明显返回一个等待对象。该等待对象将由在某个时候调用o.after(e)并等待结果的代码接收。换句话说,await o.after(e)等同于await self.test(x),这就是您要完成的工作。

通常,一个async def函数:

async def foo():
    return await bar()

可以替换为:

def foo():
    return bar()

尽管在后一种情况下foo()不异步,但最终结果是相同的:await foo()将返回等待bar()的结果。另请参见this answer