如果我尝试在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!
答案 0 :(得分:1)
我在这里假设您正在使用asyncio
库
我认为出于与@coroutine
函数的兼容性原因,建议使用装饰器async def
,
虽然没有严格执行。
asyncio.coroutine documentation
另外
@ asyncio.coroutine 装饰器,用于标记基于生成器的协同程序。这个 使生成器使用yield来调用异步def协同程序,并且 也可以通过异步def协同程序调用生成器 使用等待表达式的实例。
没有必要自己装饰异步def协同程序。