Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 530 – 异步推导式

作者:
Yury Selivanov <yury at edgedb.com>
讨论至:
Python-Dev 列表
状态:
最终版
类型:
标准跟踪
创建日期:
2016年9月3日
Python 版本:
3.6
发布历史:
2016年9月3日

目录

摘要

PEP 492PEP 525 引入了对使用 async / await 语法的原生协程和异步生成器的支持。本 PEP 提议添加列表、集合、字典推导式和生成器表达式的异步版本。

基本原理和目标

Python 对同步推导式提供了广泛的支持,允许使用简单而简洁的语法生成列表、字典和集合。我们提议为异步代码实现类似的语法结构。

为了说明可读性的改进,请考虑以下示例

result = []
async for i in aiter():
    if i % 2:
        result.append(i)

使用提议的异步推导式语法,上述代码变得如此简洁

result = [i async for i in aiter() if i % 2]

本 PEP 还使得在各种推导式中使用 await 表达式成为可能

result = [await fun() for fun in funcs]

规范

异步推导

我们提议允许在列表、集合和字典推导式中使用 async for。在 PEP 525 获得批准后,我们还可以允许创建异步生成器表达式。

示例

  • 集合推导式:{i async for i in agen()}
  • 列表推导式:[i async for i in agen()]
  • 字典推导式:{i: i ** 2 async for i in agen()}
  • 生成器表达式:(i ** 2 async for i in agen())

在异步推导式和生成器表达式中,允许将 async foriffor 子句一起使用

dataset = {data for line in aiter()
                async for data in line
                if check(data)}

异步推导式只允许在 async def 函数内部使用。

原则上,异步生成器表达式允许在任何上下文中使用。然而,在 Python 3.6 中,由于 asyncawait 的软关键字状态,异步生成器表达式只允许在 async def 函数中使用。一旦 asyncawait 在 Python 3.7 中成为保留关键字,此限制将被取消。

推导式中的 await

我们提议允许在异步和同步推导式中使用 await 表达式

result = [await fun() for fun in funcs]
result = {await fun() for fun in funcs}
result = {fun: await fun() for fun in funcs}

result = [await fun() for fun in funcs if await smth]
result = {await fun() for fun in funcs if await smth}
result = {fun: await fun() for fun in funcs if await smth}

result = [await fun() async for fun in funcs]
result = {await fun() async for fun in funcs}
result = {fun: await fun() async for fun in funcs}

result = [await fun() async for fun in funcs if await smth]
result = {await fun() async for fun in funcs if await smth}
result = {fun: await fun() async for fun in funcs if await smth}

这只在 async def 函数体中有效。

语法更新

该提议要求在语法层面进行一项更改:向 comp_for 添加可选的“async”关键字

comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]

comprehension AST 节点将具有新的 is_async 参数。

向后兼容性

该提案完全向后兼容。

接受

PEP 530 于2016年9月6日被 Guido 接受 [1]

实施

实现在 issue 28008 中进行跟踪 [3]。参考实现的 git 仓库可在 [2] 处获取。

参考资料

致谢

我感谢 Guido van Rossum、Victor Stinner 和 Elvis Pranskevichus 对本 PEP 的反馈、代码审查和讨论。


来源: https://github.com/python/peps/blob/main/peps/pep-0530.rst

上次修改: 2025-02-01 08:59:27 GMT