Как сказал другой ответ, вы не можете поместить await
в lambda
.Но если await
является крайним оператором в выражении, вы можете опустить как асинхронный, так и await, и лямбда-выражение непосредственно возвращает ожидаемое:
self.voice_channel.play(discord.FFmpegPCMAudio('music.mp3'),
after=lambda e: self.test(x))
Без await
лямбда-выражение просто возвращает 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()
.См. этот ответ для другого примера.