别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • Python 面试题
  • 2025 面试记录
  • 2022 面试记录
  • 2021 面试记录
  • 2020 面试记录
  • 2019 面试记录
  • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • Python 面试题
  • 2025 面试记录
  • 2022 面试记录
  • 2021 面试记录
  • 2020 面试记录
  • 2019 面试记录
  • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 辨析

  • Sockets编程

  • Django

  • stackoverflow

  • Flask

  • 全栈之路

  • 面试

  • 代码片段

  • 异步编程

  • 😎Awesome资源

  • PEP

    • PEP 中文翻译计划
    • [译] PEP-8 -- 编码风格指南中文版✨✨
    • [译] PEP202--列表推导式
    • [译] PEP 255--简单的生成器
    • [译] PEP 285--添加一种布尔类型
    • [译] PEP 318--函数和方法的装饰器
    • [译] PEP 328--导入多行及绝对/相对
    • [译]pep 333 -- Python Web 服务器网关接口 v1.0
    • [译]PEP 342--增强型生成器——协程
    • [译]PEP 380--子生成器的语法
    • [译]PEP 484 -- 类型提示
    • [译] PEP 525--异步生成器
    • [译] PEP 530--异步推导式
      • [译] PEP614--放宽对装饰器的语法限制
      • [译] PEP-312--Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性
      • [译]PEP 3099--Python 3 中不会改变的事情
      • [译] PEP 3105--改 print 为函数
      • [译]PEP 3107 -- 函数注解
      • [译]PEP-3129 类装饰器
      • [译] PEP 3155--类和方法的特定名称
      • [译]pep 3333 -- Python Web 服务器网关接口 v1.0.1
    • Python工匠系列

    • 高阶知识点

    • Python 学习资源待整理
    • 设计模式

    • 好“艹蛋”的 Python 呀!
    • FIFO | 待学清单📝
    • pip 安装及使用
    • 数据分析

    • 源码阅读计划

    • OOP

    • 关于 python 中的 setup.py
    • 并行分布式框架 Celery
    • 七种武器,让你的代码提高可维护性
    • 使用 pdb 调试 Python 代码
    • 每周一个 Python 标准库
    • 🐍Python
    • PEP
    佚名
    2019-11-27
    目录

    [译] PEP 530--异步推导式

    PEP 原文:https://github.com/python/peps/blob/master/pep-0530.txt

    译者 :CXA (opens new window)(python 学习开发 公众号作者)

    # 摘要

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

    # 理论和目标

    对如下代码做了改进。

    result = []
    async for i in aiter():
        if i % 2:
            result.append(i)
    
    1
    2
    3
    4

    可以写成异步推导式的方式简化上面代码:

    result = [i async for i in aiter() if i % 2]
    
    1

    同样的该 pep 也支持上述各种表达式里面使用 await 语句,像下面这样

    result = [await fun() for fun in funcs]
    
    1

    # 详细内容

    同样的我们可以创建 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()).
    
    1
    2
    3
    4

    和以前我们熟悉的推导式一样我们可以在使用 async for 来生成推导式的时候,使用条件语句 if,就像下面这样

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

    需要注意的是到 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}
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    以上语句只能在 async def 函数体中使用

    # 语句更新

    该提议需要对语法级别进行一次更改:向 comp_for 添加可选的“async”关键字:

    comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter]
    
    1

    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

    编辑 (opens new window)
    #peps
    上次更新: 2025-05-28, 09:03:31
    [译] PEP 525--异步生成器
    [译] PEP614--放宽对装饰器的语法限制

    ← [译] PEP 525--异步生成器 [译] PEP614--放宽对装饰器的语法限制→

    最近更新
    01
    支付系统策略模式实现代码
    06-04
    02
    Python 中 OOM(内存泄漏)问题的定位与分析
    05-30
    03
    MySQL 的 MVCC 与锁机制的关联和区别
    05-28
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式