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的文件类型
May 30 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
利用Pycharm断点调试Python程序的方法
Nov 29 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
Python实现分段线性插值
Dec 17 Python
浅谈sklearn中predict与predict_proba区别
Jun 28 Python
详解python with 上下文管理器
Sep 02 Python
学习Python需要哪些工具
Sep 04 Python
python Cartopy的基础使用详解
Nov 01 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
matplotlib grid()设置网格线外观的实现
Feb 22 Python
python神经网络ResNet50模型
May 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
wampserver改变默认网站目录的办法
2015/08/05 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
什么是JavaScript
2009/08/13 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
Javascript字符串对象的常用方法简明版
2014/06/26 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
JS运动特效之链式运动分析
2018/01/24 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
vue 判断元素内容是否超过宽度的方式
2020/07/29 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
python正则表达式之作业计算器
2016/03/18 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
详解Python异常处理中的Finally else的功能
2017/12/29 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
Python3中exp()函数用法分析
2019/02/19 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
详解CSS3伸缩布局盒模型Flex布局
2018/08/20 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
adidas美国官网:adidas US
2016/09/21 全球购物
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
社团活动总结报告
2014/06/27 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
Python+Selenium实现读取网易邮箱验证码
2022/03/13 Python