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]

实现

该实现跟踪在问题 28008 中 [3]。参考实现的 git 存储库可在 [2] 中获得。

参考文献

致谢

感谢 Guido van Rossum、Victor Stinner 和 Elvis Pranskevichus 提供的反馈、代码审查以及围绕此 PEP 的讨论。


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

上次修改时间:2023-09-09 17:39:29 GMT