PEP 530 -- 异步推导式

摘要

PEP 492和PEP 525使用async/await语法引入了协程。PEP 530建议添加list,set,dict推导式和生成器推导式的异步版本。

理论和目标

对如下代码做了改进。

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]

详细内容

同样的我们可以创建set,list,dict的异步推导式。

异步集合推导式: {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,就像下面这样

dataset = {data for line in aiter()
async for data in line
if check(data)}

需要注意的是到python3.6的时候async和await必须配合async def函数使用,不能写在异步函数之外,但是在python3.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]

python 推导式AST部分将加入is_async参数。这个实际上就是说加入字典异步推导式的实现,像同步那样。

是否支持向后兼容

支持向后兼容

提供人

PEP 530 由 Guido, 2016年9月6日提出.

参考资料

[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

版权声明

本文章翻译整理自,pep530

Source: https://github.com/python/peps/blob/master/pep-0530.txt

PEP 530 -- 异步推导式的更多相关文章

  1. Python_迭代器、生成器、列表推导式,生成器表达式

    1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...

  2. Python的列表推导式,字典推导式,集合推导式使用方法

    推导式分为列表推导式(list),字典推导式(dict),集合推导式(set)三种 1.列表推导式也叫列表解析式.功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表格式:用中括号括起 ...

  3. python数据类型详解及列表字典集合推导式详解

    一.运算符 Python语言支持以下类型的运算符: 算术运算符 如: #!/usr/bin/env python # -*- coding:utf-8 -*- a = 5 b = 6 print(a ...

  4. Python的高级特性2:列表推导式,生成器与迭代器

    一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...

  5. python 列表推导式

    squares = [x**2 for x in range(10)] 相当于squares = map(lambda x: x**2, range(10)),但是更简洁和易读.傻逼才会用最古老的fo ...

  6. Python的列表推导式

    1.列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 2.举例说明: #!/usr/bin/python # -*- codi ...

  7. python 之 推导式

    推导式 : 英文 comprehension 支持推导式的有列表list      字典dict      集合set      注意元组没有 推导式,如果你那样去写,他会变成一个generator生 ...

  8. 转:Python一些特殊用法(map、reduce、filter、lambda、列表推导式等)

    Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...

  9. python列表推导式详解

    推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...

随机推荐

  1. XML异常

    1.com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 1 字节的 UTF-8 序列的字节 1 无效 ...

  2. ES DSL 基础查询语法学习笔记

    1.查询数量 1 2 3 4 5 6 7 curl -XGET 'http://192.168.6.97:9200/_count?pretty' -d ' {     "query" ...

  3. CSS常用选择器的认识

    ---恢复内容开始--- 前言:在CSS中选择器的种类有很多很多,但是在实际的工作中,我们经常会用到的分为两大类:基础选择器和复合选择器这两个大类,学习选择器的目的就是为了在复杂的页面中能够快速定位到 ...

  4. 用itext合并多个pdf文件【转】【补】

    java代码 package c; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arra ...

  5. minio golang client使用

    初始化 var ( endpoint = "127.0.0.1:8888" accessKeyID = "YXU5IXETKKPX171K4Z6O" secre ...

  6. 【1】BIO,NIO,AIO与Reactor,Proactor

    讲解IO思路: BIO(一个连接一个线程) -->大并发问题-->NIO(操作系统层面:IO多路复用) -->NIO两个问题:1.谁去监听就绪(Boss),2.谁来处理已就绪(Wor ...

  7. js 格式化时间

    Date.prototype.format = function(format) { var date = { , "d+": this.getDate(), "h+&q ...

  8. Ext.net NumberField要设置MinValue,MaxValue

    <Items> <ext:NumberField ID="NumberField1" runat="server" FieldLabel=&q ...

  9. ASP.NET Web API 2 之文件下载

    Ø  前言 目前 ASP.NET Web API 的应用非常广泛,主要承载着服务端与客户端的数据传输与处理,如果需要使用 Web API 实现文件下载,该 实现呢,其实也是比较简单,以下示例用于下载安 ...

  10. Tippy.js – 轻量的 Javascript Tooltip 工具库

    工具提示(Tooltip)在网站中的一个小功能,但却有很重要的作用,常用于显示一些温馨的提示信息.如果网站中的工具提示功能做得非常有创意的话能够加深用户对网站印象.Tippy.js 是一款帮助你快速创 ...