首页 > 编程语言 >Python 如何移除旧的版本特性,如何迎接新的特性?

Python 如何移除旧的版本特性,如何迎接新的特性?

时间:2022-10-14 13:36:42浏览次数:72  
标签:https 版本 程序员 Python 除旧 特性 concurrent 模块

2020 年 4 月 20 日,Python 2 的最后一个版本 2.7.18 发布了,这意味着 Python 2 是真正的 EOL(end of life)了,一个时代终于落幕了。

Python 2.0 版本是在 2000 年发布的,至今正好到 20 周年(差半年),一代版本竟然持续了这么长时间。其中,2.7 版本是在 Python 3 推出后才发布的,它在 2010 年发布,至今已是 10 年之久。

Python 如何移除旧的版本特性,如何迎接新的特性?_python

事实上,Python 诞生了 30 年,但版本演进过程一直很慢,目前最新发布的版本只到 3.8.2。

对比一下相差几岁的隔壁家选手,C++ 已经发展到了 20,JAVA 发展到了 14 ,PHP 到了 7.4,差距悬殊。

但是,版本发布太频繁,也不总是一件好事。就在 Python 程序员抱怨自己的 Python 2 项目还没升 3 版本时,有些 JAVA 程序员还在维护 6、7 版本的项目呢。版本迁移之苦,大家彼此彼此,五十步笑百步。

编程语言跨版本间出现不兼容的特性,几乎是常态。很多时候,并不是说过去的设计是 bug,只是因为编程语言也是某种“生命体”,它会学习其它语言,也会自我进化,所以就有新陈代谢。

摆脱旧的不兼容性版本或者某些落后的设计,有时候需要挺漫长的过渡期。为了方便程序员迁移,核心开发者们形成了一些有效的惯例。

以 Python 为例,我知道有以下的几种策略:

1、DeprecationWarning 提示

当使用过期的类或方法时,会出现 DeprecationWarning 告警。

例如,从 collections 模块导入 ABC(Abstract Base Classes,即抽象基类)就是过期用法,会出现以下提示:

Python 如何移除旧的版本特性,如何迎接新的特性?_多线程_02

DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working

从 3.3 版本起,正确的用法是​​from collections.abc import Iterable​​ ,直到 3.9 版本时,会取消过期提示,出现报错。

2、将模块改名,约定为私有

在 Python 中,以单下划线“_”开头命名的变量,会被约定为私有的。如果在一个模块中定义了私有变量,理论上它就不该被导出到其它模块使用。

这种命名方式也被推广到了标准模块上。例如,在 Python 的极早期版本中有一个​​thread​​​ 模块,后来到 1.5.1 版本,以 thread 为基础又推出一个更方便好用的​​threading​​ 模块,也就是我们熟知的实现多线程的模块。

为了摆脱/屏蔽旧的实现,Python 把 thread 模块重命名为​​_thread​​ ,约定为私有的,这种方式很灵活,普通程序员不会感知它的存在,骨灰级程序员却可以用它实现更加低层的开发。

Python 如何移除旧的版本特性,如何迎接新的特性?_性能优化_03

3、文档中作 deprecated 提示

它跟 DeprecationWarning 是同样的意思。之所以要单独列出来,是因为在构思本文时,我正巧在 Python 3.8 文档中发现了一则提示,忍不住分享一下。

文档中说: @asyncio.coroutine 装饰器不再支持基于​​yield from​​ 生成器实现的协程,需要显式地写成“asyc def”这种定义方式。

Python 如何移除旧的版本特性,如何迎接新的特性?_python_04

这意味着,3.8 版本对该特性来说就是个分界线,它将进入一个平稳的淘汰周期。

以上三种方式可谓是“除旧”,是面向过去的版本所做的。与它们相对应,就少不了“迎新”的过程,要面向未来的版本。

Python 中有时候会在当前版本中加入一些实验性的特性,期待在未来版本中再完全地实现。而这,就需要给程序员们指出一些过渡性的提示。

例如,在《​​Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型​​》一文中,我就介绍了隐藏在 3.8 版本中的“vectorcall”协议,它要在 3.9 版本中才会真正地实现(而且不排除在未来还会继续扩展)。

此外,还有一个很著名的例子:3.2 版本中推出的 ​​concurrent.futures​​​ 标准库(依据 ​​PEP-3148​​)。

这是一个统合了多线程与多进程的异步开发库,“concurrent”指的是并发,而“并发”概念可以囊括多线程与多进程的实现方式。

为什么在“concurrent”下面要加一个“futures”呢?PEP-3148 中指出了这样命名的三点原因,其中最后一点是:希望在将来(in the future)能够添加和移动现有的跟并发相关的库到​​concurrent​​ 库下面。

也就是说,3.2 版本的​​concurrent.futures​​​ 就是一种实验性的设计,它是为将来更好的​​concurrent​​ 库而作的准备。虽然说将来的最终实现,可能跟 PEP 中设想的不同,但是,这种面向将来的长远考虑的设计思路,会给整个社区带来某种预期和共同的信念。

好了,聊了这么多,是时候收个尾了。

我从未真正开发或维护过 Python 2 的项目,所以在这个本应纪念它 EOL 的日子,所能想到的就是一个更具普遍性的“除旧迎新”的话题:旧的版本特性是如何逐步退出的,新的版本特性又是如何逐步加入的?

如果你喜欢这种风格的文章,欢迎搜索关注公众号“Python猫”。人生苦短,让我们一起用 Python!

推荐阅读:

本文首发地址:​​https://mp.weixin.qq.com/s/PIhtEIzBgy_ujcTeAQ2dxg​

1、Python 3.9 性能优化,更快的 list()、dict() 和 range() 等内置类型:​​https://mp.weixin.qq.com/s/bjQjVmf7dP5fOqCS1cObqQ​

2、PEP-3148:​​https://www.python.org/dev/peps/pep-3148​

3、聊聊 Python 的内置电池:​​https://mp.weixin.qq.com/s/XzCqoCvcpFJt4A-E4WMqaA​

4、聊聊 print 的前世今生:​​https://mp.weixin.qq.com/s/NuzfuH_zCZzcrmSFR04NHw​



标签:https,版本,程序员,Python,除旧,特性,concurrent,模块
From: https://blog.51cto.com/u_14244765/5756338

相关文章

  • Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
    毫无疑问Python中没有所谓的main入口函数,但是网上经常看到一些文章提“Python的main函数”、“建议写main函数”……有些人是知情的,他的意图可能是模仿那些正宗的......
  • Python 为什么不用分号作终止符?
    一般而言,编程语言中使用分号“;”来实现两种目的:作为语句分隔符:使用分号来分隔语句(statement),这样就能在一行代码中书写多条语句(一行多句)作为语句终止符:使用分号来终止语句,这......
  • Python小技巧:如何批量更新已安装的库?
    众所周知,升级某个库(假设为xxx),可以用​​pipinstall--upgradexxx​​​命令,或者简写成​​pipinstall-Uxxx​​。如果有多个库,可以依次写在xxx后面,以空格间隔。那......
  • 一篇文章掌握 Python 内置 zip() 的全部内容
    一篇文章掌握Python内置zip()的全部内容zip()是Python中最好用的内置类型之一,它可以接收多个可迭代对象参数,再返回一个迭代器,可以把不同可迭代对象的元素组合起来。......
  • Python 之父爆料:明年至少令 Python 提速 1 倍!
    大概在半年前,我偶然看到一篇文章,有人提出了给Python提速5倍的计划,并在寻找经费赞助。当时并没有在意,此后也没有看到这方面的消息。但是,就在5月13日“2021年Python......
  • Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?
    本文出自“Python为什么”系列,请查看​​全部文章​​在日常使用Python时,我们经常需要创建一个列表,相信大家都很熟练了吧?#方法一:使用成对的方括号语法list_a=[]#方法......
  • Python最会变魔术的魔术方法,我觉得是它!
    在​​上篇文章中​​,我有一个核心的发现:Python内置类型的特殊方法(含魔术方法与其它方法)由C语言独立实现,在Python层面不存在调用关系。但是,文中也提到了一个例外:一个非......
  • Python 中的数字到底是什么?
    花下猫语:在Python中,不同类型的数字可以直接做算术运算,并不需要作显式的类型转换。但是,它的“隐式类型转换”可能跟其它语言不同,因为Python中的数字是一种特殊的对象,派生......
  • Python 为什么要有 pass 语句?
    本文出自“Python为什么”系列,请查看​​全部文章​​关于Python中的​​pass​​语句,它似乎很简单(只有4个字母),即使是没有任何编程经验的初学者也能很快地掌握它的用法......
  • Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
    从接触Python时起,我就觉得Python的元组解包(unpacking)挺有意思,非常简洁好用。最显而易见的例子就是多重赋值,即在一条语句中同时给多个变量赋值:>>>x,y=1,2>>>print(......