如果你仍在使用2.x,那么是时候将你的代码移植到Python3了。
整理
屠敏
在技术的长河中,软件、工具、系统等版本的迭代本是常事,但由于使用习惯、版本的兼容性、易用性等因素,很多用户及开发者在使用或做开发的过程中,并不愿意及时同步更新,而这无疑为IT技术圈带来了诸多碎片化问题,正如系统之Android、Windows,也正如编程语言之Python。
近日,Python因为其版本的碎片化问题遭到了英国国家网络安全中心(NCSC)的点名,NCSC警告开发者们必须考虑将Python2.x的代码库移植到Python3.x版本上,主要是因为自年1月1日起,Python2.x将走到其生命的尽头,不再得到支持(EOL,End-of-life)。与此同时,NCSC还将继续使用Python2.x的公司比作EOL以引诱另一个WannaCry(病毒)或Equifax(信息泄露)事件的发生。
Python的应用现状
回望近些年才被AI点燃的Python,其实并非是一门新的语言,它最早于年底由知名的荷兰计算机程序员GuidovanRossum发明,后来作为一门面向对象、直译式计算机程序设计语言于年面世。其30年的发展历程可谓比编程语言界的常青藤Java更为久远。
而论及Java,一年两次迭代的速度早已让不少开发者痛苦不堪,其纷纷开启对Oracle的吐槽模式,并直言“马上推出JDK13的你只管更新,不用顾及我们的感受,总之我们还坚守在JDK1.x”。事实上,不止Java,Python也有着相同的问题,很多人对Python旧版本的坚持反而也让该语言的核心开发者们也备受煎熬,因为旧版本在安全性、功能上均无法与新版本相媲美,容易出现很多Bug。
根据著名IDE开发商JetBrains和Python基金会于今年年初发布的《PythonDevelopersSurveyResults》报告显示,Python3的采用率正在快速增长,将其作为主要解释器的开发者比例从年的75%上升到了84%,不过与此同时,Python2仍占有16%的份额。
其中,在Python2.x版本中,Python2.7最受欢迎且使用的人数最多,占比93%。
那么这些开发者究竟为何不愿意升级?
Python的版本之过
一直以来,语法简单、拥有丰富和强大类库的Python被称之为一门胶水语言,它能够很轻松的把用其它语言制作的各种模块(尤其是C/C++)轻松地联结在一起。
不过在版本的迭代过程中,Python出现了一个经常被开发者们诟病的问题,即于年发布的Python3在设计时没有考虑向较早版本相容的问题,Python2.x版本与Python3.x之间并不兼容。这意味着如果你的软件是基于Python2开发的,想要迁移到Python3上面,无疑需要耗费巨大的成本。而且在此过程中,如果项目涉及到诸多关于Python2的类库,可能还会导致迁移失败。
而自此问题的出现让不少原本想要升级的开发者宁愿停留在以前的旧版本中,对此,有不少网友表示:
Python2.x和Python3.x两者在编码效率上没有明显差距,但是Python3.x却要花额外的成本处理兼容性问题;感觉Python2和Python3是两门不同的语言,只不过他们的语法相似罢了;......除此之外,根据来自Python社区开发和共享软件的存储中心PythonPackageIndex统计显示,当前主流的Python软件包中仍然有不少使用的是Python2.x版本。且其中,每个包每个月的下载量高达百万次。而想要将这些包移植到Python3上,也绝非是一件易事。
Python2.x淘汰乃大势所趋
诚然开发者有多少个不愿意,但Python2.x淘汰已成必然趋势。早在年3月,Python之父GuidovanRossum就曾在邮件列表上宣布Python2.7将于年1月1日终止支持,这意味着之后Python2将不再被统一维护,与之对应的是主流第三方库也不会再提供针对Python2版本的开发支持。不过,想要继续使用旧版本也并非不可,就如同Java一样,交付商业费用即可,但这样的做法在日新月异的技术圈中,显然不是长久之计。
如今NCSC的警醒,再次告诫开发者们,“如果继续使用不受支持的模块,公司就会冒着组织和数据的安全性风险,因为漏洞迟早会出现,而且没人会修复。”
与此同时,来自NCSC的平台安全研究员RichM也于官方博客上列举了不升级Python2将面临的种种问题:
依赖项
许多流行的项目,如NumPy、Requests和TensorFlow等承诺到年将停止支持2.x,并且当前一些项目已经这么做了。
这意味着如果你想使用你喜欢模块的最新功能,那么就需要使用Python3。等待更新的时间越长,到时将更改的依赖项的Python3版本会越多,更新起来会变得越困难。
或将阻碍其他开发者
如果你正在维护其他开发者所依赖的库,则可能会阻止他们更新到Python3。如果阻碍其他开发者,你会在间接、可能无意中加大其他项目面临的安全风险。
你也许不在公司外部发布任何代码,但要考虑可能也在内部使用你代码的同事。
错失最新的Python功能
表达式的收益——允许生成器将其部分操作委托给另一个生成器。Unicode字符串——Unicode处理起来更容易。打印函数——打印函数有额外的功能,使其更灵活。视图和迭代器取代列表——一些众所周知的API不再返回列表。比如说,字典返回键、值或两者的视图。“multi-with”语句——复杂的with语句更易于阅读。使用*和**解包——扩展*可迭代解包运算符和**字典解包运算符的用途。现在可以在函数调用中使用任意数量的解包运算符。纯关键字实参——允许实参出现在varargs参数的后面。F字符串——运行时评估的一种新类型的字符串常量,可能含有任何有效的Python表达式。大量的加速和优化机制。
Python2.x如何迁移到Python3.x?
如今Python已经被广泛应用于Google、Facebook、Netflix等实践的生产环境中,也横扫了各大编程语言排行榜,对此,更有人预估,其可能在未来几年内超越C和Java,成为无可争议的编程语言领导者。
那么对于普通的开发者而言,又该如何丢弃Python2.x版本,向Python3.x版本移植?基于此,NCSC给出了如下的一些程序、教程和书籍,希望对大家有所裨益:
「CanIUsePython3」(