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. 设计模式_代理模式_在SqlSessionTemplate(Spring)中的应用

    1.SqlSessionTemplate的构造函数,根据传入的SqlSessionFactory和ExecutorType创建一个Spring管理的SqlSession,并生成SqlSession的动 ...

  2. 11:12:21.924 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.

    11:12:21.924 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class or ...

  3. springcloud配置需要主要的地方

    Eureka服务端 注册中心 <!-- Eureka服务端 --> <dependency> <groupId>org.springframework.cloud& ...

  4. 13.模板方法(Template Method)

    无处不在的Template Method     如果你只想掌握一种设计模式,那么它就是Template Method!动机(Motivate):    变化 -----是软件设计的永恒主题,如何管理 ...

  5. Kafka技术内幕 读书笔记之(六) 存储层——服务端处理读写请求、分区与副本

    如下图中分区到 日 志的虚线表示 : 业务逻辑层的一个分区对应物理存储层的一个日志 . 消息集到数据文件的虚线表示 : 客户端发送的消息集最终会写入日志分段对应的数据文件,存储到Kafka的消息代理节 ...

  6. C语言数据类型的转换(隐式转换)

    算术运算符中的转换规则: double ←── float 高↑long↑unsigned↑int ←── char,short 低 注意: 图中横向箭头表示必须的转换,如两个float型数参加运算, ...

  7. 全面理解JavaScript中的 this

    全面理解JavaScript中的 this 上下文 VS 作用域 作用域(scope) 是在运行时代码中的某些特定部分中变量,函数和对象的可访问性.换句话 说,作用域决定了代码区块中变量和其他资源的可 ...

  8. 20秒教你如何写maven2的pom文件的依赖包

    所有Maven 库 需要的包 及 pom.xml 中 groupId  artifactId version 都可在这个网上收到. 例如:需要 通过 maven 在项目 中 添加 geronimo-k ...

  9. ModSecurity SQL注入攻击 – 深度绕过技术挑战

    ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecuri ...

  10. 【bzoj 2049】Cave 洞穴勘测

    Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...