我要对lambda函数使用“ await”,如下所示。
self.voice_channel.play(discord.FFmpegPCMAudio('music.mp3'), after=lambda e: await self.test(x))
SyntaxError: 'await' outside async function
如何修复它,使其具有这种感觉?
答案 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。