Python 为什么我要在“@asyncio.coroutine”上使用“async def”?

Python 为什么我要在“@asyncio.coroutine”上使用“async def”?,python,python-3.x,asynchronous,async-await,backwards-compatibility,Python,Python 3.x,Asynchronous,Async Await,Backwards Compatibility,Python3.5使用新的函数定义语法大大扩展了对异步编程的支持。而异步函数以前只是“具有优势的生成器”: 它们现在有自己的特殊声明语法和特殊行为,不再像通常的生成器函数那样可用: aysnc def generate_async_native(): """ A coroutine that returns 1 - 100 This CANNOT be used as a generator, and can ONLY be executed by running it

Python3.5使用新的函数定义语法大大扩展了对异步编程的支持。而异步函数以前只是“具有优势的生成器”:

它们现在有自己的特殊声明语法和特殊行为,不再像通常的生成器函数那样可用:

aysnc def generate_async_native():
    """
    A coroutine that returns 1 - 100
    This CANNOT be used as a generator, and can ONLY be executed by running it from an event loop
    """
    for i in range(100):
        await i
这是而不是关于这些类型之间的功能或实际差异的问题,在中进行了讨论

我的问题是:我为什么要使用
async def
?与
@asyncio.coroutine
相比,它似乎没有提供任何额外的好处,但却带来了额外的成本

  • 中断向后兼容性(Python 3.5代码与
    async def
    甚至不会在旧版本中解析,尽管这可能是一个特性,而不是一个bug)和
  • 似乎在如何调用函数方面提供了较少的灵活性

  • 一个可能的答案是:

    其优点是,通过本机支持,还可以引入其他语法来支持异步上下文管理器和迭代器。进入和退出一个上下文管理器,或者循环遍历一个迭代器,可能会成为您的共同例程中的更多点,表明其他代码可以运行,因为有东西再次等待


    事实上,新的
    async with
    async for
    语法实现了这一点,它不能像装饰过的生成器那样用“附加”解决方案轻松实现。

    我删除了
    syntax
    标记,并添加了
    python
    标记。通常,您应该将python标记添加到所有python问题中,因为大多数人都会跟踪它。
    aysnc def generate_async_native():
        """
        A coroutine that returns 1 - 100
        This CANNOT be used as a generator, and can ONLY be executed by running it from an event loop
        """
        for i in range(100):
            await i