如何在Python中访问异步函数的返回值?

如何在Python中访问异步函数的返回值?,python,asynchronous,Python,Asynchronous,如果我尝试在Python中运行以下代码,则会出现以下错误: async def foo(): yield 1 async def bar(): x = await foo() b=bar() b.send(None) TypeError:对象异步\u生成器不能在“wait”表达式中使用 另一方面,以下代码可以工作(并抛出StopIteration,但这是预期的): 为什么这样不行 如果我将foo替换为: @coroutine def foo(): yield 1 这

如果我尝试在Python中运行以下代码,则会出现以下错误:

async def foo():
    yield 1

async def bar():
    x = await foo()
b=bar()
b.send(None)
TypeError:对象异步\u生成器不能在“wait”表达式中使用

另一方面,以下代码可以工作(并抛出StopIteration,但这是预期的):

为什么这样不行

如果我将
foo
替换为:

@coroutine
def foo():
    yield 1

这里的问题是,这似乎很奇怪,我很确定这不是获得这种行为的推荐方式。然后在大多数语言中,您只需要异步和等待,而不是@coroutine

我在这里假设您使用的是
asyncio
库。
我认为出于与
异步def
函数兼容的原因,建议使用decorator
@coroutine

虽然这并没有严格执行

@asyncio.coroutine用于标记基于生成器的coroutine的装饰器。这 使生成器能够使用yield from调用异步def协同路由,以及 另外,允许异步def协同程序调用生成器,例如 使用等待表达式的实例

不需要修饰异步def协程本身

@coroutine
def foo():
    yield 1