PEP 530 – 异步推导式
- 作者:
- Yury Selivanov <yury at edgedb.com>
- 讨论至:
- Python-Dev 列表
- 状态:
- 最终版
- 类型:
- 标准跟踪
- 创建日期:
- 2016年9月3日
- Python 版本:
- 3.6
- 发布历史:
- 2016年9月3日
摘要
PEP 492 和 PEP 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 for 与 if 和 for 子句一起使用
dataset = {data for line in aiter()
async for data in line
if check(data)}
异步推导式只允许在 async def 函数内部使用。
原则上,异步生成器表达式允许在任何上下文中使用。然而,在 Python 3.6 中,由于 async 和 await 的软关键字状态,异步生成器表达式只允许在 async def 函数中使用。一旦 async 和 await 在 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 参数。
向后兼容性
该提案完全向后兼容。
接受
实施
参考资料
致谢
我感谢 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