Python 3.8新特征之asyncio REPL


Posted in Python onMay 28, 2019

前言

我最近都在写一些Python 3.8的新功能介绍的文章,在自己的项目中也在提前体验新的Python版本。为什么我对这个Python 3.8这么有兴趣呢?主要是因为在Python 2停止官方维护的2020年来临之前,Python 3.8是最后一个大版本,虽然还没有公布Python 3.9的发布时间表,但是按过去的经验,我觉得至少等Python 3.8.4发布之后才可能发布Python 3.9.0,那会应该已经在2020年年末了。所以大家最近2年的话题都会是Python 3.8。本周五(2019-05-31)将发布3.8.0 beta 1,这几天开发者们都在抓紧时间合并代码赶上Python 3.8最后一班车。这几天我将陆续分享几个新合并的特性。今天先说 asyncio REPL

REPL

REPL是 Read-Eval-Print Loop 的缩写,是一种简单的,交互式的编程环境:

  • Read。获得用户输入
  • Eval。对输入求值
  • Print。打印,输出求值的结果
  • Loop。循环,可以不断的重复Read-Eval-Print

REPL对于学习一门新的编程语言非常有帮助,你可以再这个交互环境里面通过输出快速验证你的理解是不是正确。CPython自带了一个这样的编程环境:

python
Python 3.7.1 (default, Dec 13 2018, 22:28:16)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def a():
...   return 'A'
...
>>> a()
'A'

不过官方自带的这个环境功能非常有限,有经验的Python开发者通常会使用IPython,我写的大部分文章里面的代码都在IPython里面执行的, 而且IPython从 7.0开始支持了Async REPL:

ipython

defPython 3.7.1 (default, Dec 13 2018, 22:28:16)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.5.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: def a():
  ...:   return 'A'
  ...:
In [2]: a()
Out[2]: 'A'
In [3]: import asyncio
In [4]: async def b():
  ...:   await asyncio.sleep(1)
  ...:   return 'B'
  ...:
In [5]: await b()
Out[5]: 'B'

In [6]: asyncio.run(b())
Out[6]: 'B'

简单地说,就是在IPython里面可以直接使用await,而不必用 asyncio.run(b()) 。这个在官方REPL里面是不行的:

python

Python 3.7.1 (default, Dec 13 2018, 22:28:16)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> async def b():
...   await asyncio.sleep(1)
...   return 'B'
...
>>> await b()
 File "<stdin>", line 1
SyntaxError: 'await' outside function

是的,await只能在异步函数里面才可以使用。

Python 3.8的asyncio REPL

好消息是官方REPL也与时俱进,支持asyncio REPL了。具体细节可以看延伸阅读链接1: 

./python.exe -m asyncio
asyncio REPL 3.8.0a4+ (heads/master:8cd5165ba0, May 27 2019, 22:28:15)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> async def b():
...   await asyncio.sleep(1)
...   return 'B'
...
>>> await b()
'B'
>>> async def c():
...   await asyncio.sleep(1)
...   return 'C'
...
>>> task = asyncio.create_task(c())
>>> await task
'C'
>>> await asyncio.sleep(1)

注意激活REPL不是直接输入python,而是要用 python -m asyncio ,另外那个 import asyncio 是激活REPL时自动帮你输入的。

延伸阅读

先别看代码,看看你能不能实现这个功能 :yum:

https://github.com/python/cpython/pull/13472

总结

以上所述是小编给大家介绍的Python 3.8新特征之asyncio REPL,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python中多线程thread与threading的实现方法
Aug 18 Python
Python、Javascript中的闭包比较
Feb 04 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 Python
python实现可视化动态CPU性能监控
Jun 21 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
Python设计模式之建造者模式实例详解
Jan 17 Python
python pytest进阶之conftest.py详解
Jun 27 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
python使用pygame创建精灵Sprite
Apr 06 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 #Python
Python学习笔记之变量、自定义函数用法示例
May 28 #Python
Python分布式进程中你会遇到的问题解析
May 28 #Python
Python增强赋值和共享引用注意事项小结
May 28 #Python
Django框架用户注销功能实现方法分析
May 28 #Python
Django框架首页和登录页分离操作示例
May 28 #Python
Django框架封装外部函数示例
May 28 #Python
You might like
基于mysql的论坛(7)
2006/10/09 PHP
PHP4和PHP5共存于一系统
2006/11/17 PHP
ThinkPHP实现一键清除缓存方法
2014/06/26 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
PHP5.6新增加的可变函数参数用法分析
2017/08/25 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
js对象转json数组的简单实现案例
2014/02/28 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
JS中数据结构之栈
2019/01/01 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
python lxml中etree的简单应用
2019/05/10 Python
python字典的常用方法总结
2019/07/31 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
python中time、datetime模块的使用
2020/12/14 Python
巴西网上药房:onofre
2016/11/21 全球购物
上海某公司.net方向笔试题
2014/09/14 面试题
三好学生自我鉴定
2013/12/17 职场文书
大学生自我鉴定评语
2014/01/27 职场文书
小松树教学反思
2014/02/11 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
创业计划书之书店
2019/09/10 职场文书
Oracle以逗号分隔的字符串拆分为多行数据实例详解
2021/07/16 Oracle