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