Python 列表解析式惊人异步!

摘要

异步推导式:让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

关注不迷路

扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!

温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
文章版权声明 1、本网站名称:宇凡盒子
2、本站文章未经许可,禁止转载!
3、如果文章内容介绍中无特别注明,本网站压缩包解压需要密码统一是:yufanbox.com
4、本站仅供资源信息交流学习,不保证资源的可用及完整性,不提供安装使用及技术服务。点此了解
5、如果您发现本站分享的资源侵犯了您的权益,请及时通知我们,我们会在接到通知后及时处理!提交入口
0

评论0

请先

站点公告

🚀 【宇凡盒子】全网资源库转储中心

👉 注册即送VIP权限👈

👻 全站资源免费下载✅,欢迎注册!

记得 【收藏】+【关注】 谢谢!~~~

立即注册
没有账号?注册  忘记密码?

社交账号快速登录