摘要
异步推导式:让Python异步编程更简单。让我们在异步代码中使用推导式,更加优雅地处理异步数据。
正文
PEP全文:https://www.python.org/dev/peps/pep-0530
PEP文章标题:PEP 530 — Asynchronous Comprehensions
PEP创作者:Yury Selivanov
建立日期:2016-09-03
合入版本号:3.6
译员:豌豆花下猫@Python猫
PEP汉语翻译方案:https://GitHub.com/chinesehuazhou/peps-cn
引言
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。待 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)}
data = {data for line in aiter() async for data in line if check(data)}
多线程函数解析式只容许在“async def”涵数中应用。
正常情况下,多线程制作器关系式容许用在一切前后文中。殊不知,在 Python 3.6 中,因为 async 和 await 仅仅“软关键词”(soft-keyword),多线程制作器关系式只容许在 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]
函数解析式的 AST 连接点将有一个新的 is_async 主要参数。
向后兼容模式
本提议是彻底向后兼容的。
接纳
在 2016 年 9 月 6 日[1],PEP-530 被 Guido 接纳。
参照原材料
1、 https://mail.python.org/pipermail/python-ideas/2016-September/042141.html
2、https://github.com/1st1/cpython/tree/asyncomp
3、http://bugs.python.org/issue28008
感谢
谢谢 Guido van Rossum、Victor Stinner 和 Elvis pranskevichuss 针对这一 pep 的意见反馈、编码检查和探讨。
著作权
本文本文档已进到公共性。
源代码:https://github.com/python/peps/blob/master/pep-0530.txt
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
评论0