Python как использовать await в лямбде - PullRequest
2 голосов
/ 27 сентября 2019

Я хочу использовать 'await' для лямбда-функции, как показано ниже.

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

SyntaxError: 'await' outside async function

Как я могу это исправить, чтобы она выглядела так?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Я не думаю, что есть способ сделать лямбда-асинхронным, но вы можете сделать что-то вроде:

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

self.voice_channel.play(discord.FFmpegPCMAudio('music.mp3'), after = temp)
0 голосов
/ 28 сентября 2019

Как сказал другой ответ, вы не можете поместить 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().См. этот ответ для другого примера.

...