来喽,来喽,Python 3.9 正式版发布了~~~
摘要:2020年10月5日,在全国人员欢度国庆节和中秋节时,Python 3.9 悄摸摸地正式发布了。
2020年10月5日,在全国人员欢度国庆节和中秋节时,Python 3.9 悄摸摸地正式发布了。我们来一起来看看,这个版本有哪些好玩的新特性,以及对我们部门目前的产品可能会带来哪些影响。
因为jupyter notebook/lab等工具还没有相应适配到python 3.9,所以我们还无法使用,因此本文就使用python 的交互行来演示。
Python 3.9 官方文档,What’s New in Python 3.9,其文字组织的很好,我们接下来也按照这个顺序来讲解,依次是,release highlights, new features, new modules, improve modules, optimizations, deprecated, removed.大家注意看下,这个文字组织顺序,其实在我们产品发布时,也是适用的。先讲这个版本有什么吸引人的highlights,然后介绍新版本的新内容,最后介绍deprecated / removed,提醒大家升级时需要注意什么,条理很清晰。
安装
到2020年10月9日为止,anaconda上还没有任何channel支持对python 3.9的直接安装,所以想尝鲜,有2种方法:
1.到http://python.org上下载安装包
2.到anaconda的conda-forge channel下载安装文件
我们使用第二种方法,安装文件下载链接见 References。
Release Highlights
Python 3.9 内容包括:
3个新的语法特性
1个新的内置特性
2个新的标准库特性
6点解释器提升
2个新的库模块
如果把以上所有内容都过一遍,可能需要1-2小时。我们这里就挑一些与我们部门产品开发相关的内容,具体来讲一讲,其它内容如果有兴趣,可以自行去读读。
New Features
Dictionary Merge & Update Operators
dict类提供了merge (|) 和 update (|=) 操作符。
这在dict操作时,会更方便。
New string methods to remove prefixes and suffixes
这在string删除不需要的prefix 或 suffix时,会更方便。
Type hinting generics in standard collections
在type annotation中,可以使用内置的collection类型,如list和dict,而不用导入相应的大写类型,如 typing.List 或 typing.Dict。
Annotation是python 3.0 引入的特征,是做什么用的呢?与Java / C / C++ / Swift等强类型语言不同,Python和JavaScript都是弱类型语言,这里类型annotation并不会在解析或运行时强制要求传参的类型,而只是帮助开发者的代码阅读和维护。
另外,如果我们使用python 3.7引入的库,dataclasses,时,就会发现,type annotation在定义一个data类时,是强制要求的,比如:
这个时候就会比较有用,我们可以这样写:
而不用像之前那样:
新的解析器
Python 3.9 开始使用新的解析器,基于 PEG,而取代LL(1)。两者的性能相差不大,但PEG更灵活。从这里我们可以推断,从Python 3.10开始,将会引入更多新的语言特性。
zoneinfo
这个新模块,在我们操作时区时,会比较方便。之前我们处理timezone时,需要通过pytz包,比如:
现在可以通过标准库中的zoneinfo模块,比如:
其它变化
在python 3.8中,Vectorcall协议被临时引入,3.9中,对内置类型,包括,range, tuple, set, frozenset, list, dict,都使用vectorcall协议进行了优化。但有趣的是,从性能优化报告中,我们可以看到,从3.8到3.9的性能并没有什么提升,甚至有小幅下降。
备注:以上结果是python 官方 benchmark, Tools/scripts/var_access_benchmark.py, 的运行结果,单位为纳秒,硬件为Intel® Core™ i7-4960HQ 处理器,OS为macOS 64-bit。
注意 Deprecated / Removed
我提取了一些与我们部门产品可能相关度比较高的几点:
(1)Python 3.9 是提供 Python 2向后兼容的最后一个版本,所以在下个版本 Python 3.10 将不在兼容 Python 2。
(2)threading.Thread类的 isAlive() 方法被删除,用is_alive()取代。
(3)base64.encodestring() 和 base64.decodestring() 被删除,用base64.encodebytes() 和 base64.decodebytes() 取代。
(4)json.loads()的encoding参数被删除,encoding必须为UTF-8, UTF-16或UTF-32.
复习 Python 3.8 的几点特性
最后,我们再复习下 python 3.8 的几点新特性,如果工作中没有尝试过,那就马上试试吧。
海象操作符 :=
Positional-only 参数
f-string支持 =
References
What’s new in python 3.9, https://docs.python.org/3/whatsnew/3.9.html
What’s new in python 3.8, https://docs.python.org/3/whatsnew/3.8.html
Conda-forge python files, https://anaconda.org/conda-forge/python/files
Python 3.9 tar, https://anaconda.org/conda-forge/python/3.9.0/download/win-64/python-3.9.0-h60c2a47_1_cpython.tar.bz2
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/dda3f78f7882fe60b629405df】。文章转载请联系作者。
评论