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

时间:2017-09-29 07:05:16

标签: python asynchronous

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

async def foo():
    yield 1

async def bar():
    x = await foo()
b=bar()
b.send(None)
  

TypeError:对象async_generator无法用于等待'表达

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

async def foo():
    pass

async def bar():
    await foo()
b=bar()
b.send(None)

为什么这不起作用?

如果我将foo替换为:

,我可以使它工作
@coroutine
def foo():
    yield 1

这里的问题是,这看起来很奇怪,我很确定这不是推荐的获取此行为的方法。然后在大多数语言中你只需要异步和等待,而不是@coroutine!

1 个答案:

答案 0 :(得分:1)

我在这里假设您正在使用asyncio库 我认为出于与@coroutine函数的兼容性原因,建议使用装饰器async def

  

虽然没有严格执行。

asyncio.coroutine documentation

另外

  

@ asyncio.coroutine 装饰器,用于标记基于生成器的协同程序。这个   使生成器使用yield来调用异步def协同程序,并且   也可以通过异步def协同程序调用生成器   使用等待表达式的实例

     

没有必要自己装饰异步def协同程序。