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
上次修改时间:2023-09-09 17:39:29 GMT