首页 / 程序员 / 正文
为什么迁移至 Python 3 这么难?
司必进反卖 发表于:2020-3-25 12:52:09 复制链接 看图 发表新帖
阅读数:29429

下载APP可以快速和圈友联系

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

2020 年 1 月 1 日,Python 2 的生命周期正式停止,Python 焦点开辟职员也公布行将不再供给该版本的平安更新,并倡议用户尽快迁移至 Python 3。但是题目也在此时出现了,非论 Python 3 有几多优点,迁移的进程对于用户来说都极为疾苦,可是假如不这么做的话,又会有其他题目出现。对此,开辟者只剩一声长叹,难啊!
迁移至 Python 3,用户怨声载道


2020 年 3 月 4 日,一位用户在 Twitter 上吐槽:

为什么迁移至 Python 3 这么难?-1.jpg

他的大要意义是:“每小我都对峙要摆脱 Python 2,但这样的做法却将我们具有的一切功用完善且有用的 Python 2 代码从资产酿成欠债。”

随后他又举例说:

为什么迁移至 Python 3 这么难?-2.jpg

“自 2011 年用 Python 2 编写以来,我的 milter 实现一向是完全稳定的。现在,我不能不破坏它的稳定性,由于 Python 2 没法用了。”

有一样感受的人不但是他一个,特别是那些至公司的开辟职员。

2013 年, Facebook 计划将代码迁移至 Python 3 ,可是从发生这个想法到真正托付,一共花费了四年的时候,代码迁移仅仅是困难的起头,更重要的是让自己的员工利用并顺应 Python 3;还有 LinkedIn 停止的“旷日持久战”,550 个代码存储库(库、利用法式和办事)要迁移、上百万行的代码要处置,还有内部用于延续集成 / 延续托付(CI/CD)框架、号令行接口以及摆设和数据科学工具,这类散乱的非整体式情况用 Warsaw 的话来说“包括数百种自力的微办事和工具,外加几十个支持库。

如此浩大的工程,花费的时候、精神都是庞大的,介入其中的人怨声载道,甚至有人将其称之为“噩梦般的工作”。但是当庞大的迁移终究完成,新的题目又出现了。

跨平台的散布式版本控制软件 Mercurial 就是 Python 编写的,所以对于向 Python 3 的迁移,Mercurial 也是很是的积极。在履历了一样大范围的迁移后,题目表露了出来,负责 Mercurial 运维工作的工程师 Gregory Szorc 在博客上停止了一番吐槽:

简而言之,我将 Mercurial 和其他项目移植到 Python 3 的经历极大地破坏了我对 Python 的了解。从说话到热情的社区,我一向以来都对 Python 布满爱,但我仍在尽力了解 Python 若何经过挑选他们所做的过渡计划来想法给社区带来如此多的困难。



Python 3.0 于 2008 年 12 月 3 日公布,社区花了十年的时候来接管它。这应当被普遍以为是失利的。



我真的对 Python 很不满足。移植到 Python 3 所需的工作量惊人。对于 Mercurial 而言,Python 3 引入了很多题目,但并不能处理很多题目。我们在泥泞中摸爬滚打了好几年,直到终极堕入比我们起头时更糟的状态。我敢必定,几年后它将变得更好。可是在此之前,我们要履历 5 年以上的过渡期。官方宣称 Python 3 过渡会对项目形成破坏和干扰,这是一种太轻描淡写的说法。
题目出在那里?


Python 3 的迁移为什么如此困难?回答这个题目之前,我们先简单领会一下它诞生的布景。

自 2008 年公布以来,Python 2.0 已经走过了十多个年头。它的最初一次严重更新 ——Python 2.7 是在 2010 年。

虽然 Python 2.x 是一个还不错的版本,但同时也带来了相当大的历史负担,例如,它有两种整数范例;存在恼人的 Unicode 编码题目;它混淆了怠惰和渴望的功用工具;它有一个标准的库,但加载内存很是庞大;它自诩的强范例,却有偶然使人啼笑皆非的运算成果 None < 3 < “2”。总的来说,它的一些“阴晦角落“,包括了 Python 1 时代太多的历史负担。

由于修复这些题目能够会破坏现有代码,而几近一切为 2.0 编写的代码仍可在 2.7 上运转,Python 3 应运而生。

为什么迁移至 Python 3 这么难?-3.jpg

设想之初,Python 3 的预期是用户会间接转移到新版本,从而放弃利用 Python 2 。但是在一路头,人们有很多来由不采用 Python 3:最首要的缘由是,它并没有与 Python 2 兼容。同时,大大都的库希望同时在 Python 2 和 Python 3 上运转,这在一路头很难运作,而且由于缺少支持工具,移植代码的工作非常艰难。

转折点发生在大约 2016 年左右的 Python 3.5 刊行版中 ,该版本增加了矩阵乘法、引入了 asyncio、对 OrderedDict 的速度停止了提升以及实现了范例提醒,这些提醒为 Python 带来了一些类似于静态说话的功用。

更高版本包括更多功用,例如 Pathlib 库和 f 字符串操纵。 经过这些变动,人们利用的很多库(例如用于机械进修的 scikit-learn )起头向 Python 3 迁移。

除了 Python 3 自己存在的一些技术题目,用户不愿意迁移的首要缘由还有这样几点:

平安题目。 具有嘲讽意味的是,用户会以为不停止升级会带来更大的风险,可是在大型构造或机构中,不答应员工自己升级 Python:治理员或平安团队会向他们推送更新。 在某些情况下,也不答应下载 PIP。 假如 Python 2 是平安团队赞成的默许设备,那末它能够需要做出庞大的尽力才能压服人们将其切换到 3,特别是在遭到严酷监管(例如医疗保健或金融)和政府的情况中。

利用惯性。 虽然很多版本的 Linux 中(例如 RHEL),都同时兼容 Python 2 与 Python 3,但这不是默许的选项,是以用户在 2 和 3 之间切换时,经常发现一些毛病,特别是指向系统版本的指针,例如,在 Debian 上利用 Python。
若何避免迁移出现题目?


若何迁移到 Python 3?每家公司的做法能够有所分歧,所以在此之前,不如先看看官方给出的倡议。

Python 软件基金会已经为需要同时运转 Python 2 和 3 的构造供给了若何实现跨代兼容性的综合指南,以下是其倡议的摘要:

1. 放弃对 Python 2.6 和更早版本的支持,由于从 Python 2.7 迁移要轻易很多,而且假如必须运转 Python 2.6,请斟酌利用 six library 来与 Python 3 兼容。

2. 确保 setup.py 文件正确指定了代码库支持的 Python 版本,而且该文件最少包括 Programming Language :: Python :: 2 :: 仅作为 trove 分类器。

3. 测试套件应最少具有 80%的代码覆盖率,即在测试进程中履行几多源代码的称号。假如不领会代码覆盖率,请利用 coverage.py 供给的工具。

4. 阅读 Python 的“新增功用”文档和免费的“ 移植到 Python 3”手册,领会 Python 2 和 Python 3 之间的区分。

5. 利用 Futurize 或 Modernize 使 Python 2 代码与 Python 3 兼容,请确保阅读文档,以便处理这些没法处置的题目。

6. 确保顺应在 Python 2 和 3 之间处置整数除法的变动。例如,在 Python 2 中 9/2 = 4,而在 Python 3 中 9/2 = 4.5。假如可以在代码中利用“future import”除法和“//”运算符停止整数除法,那末代码已经与 Python 3 兼容。

7.Python 3 变动了可以与 str 范例一路利用的数据,以使文本和二进制数据之间的区分加倍清楚。不幸的是,对于同时处置文本和二进制数据的代码,必须履行以下步调以确保代码合适要求: https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data

8. 当运转的代码因运转的版本分歧而表示分歧时,最好检查 Python 3 支持的特定功用能否可以运转,而不是检查 sys.version_info [0] 能否即是 3。

9. 为了帮助对齐用 Python 3 编写的任何新代码并确保其兼容性,请在建立的任何新模块的顶部利用以下语句:from future import absolute_import, from future import division, 以及 from future import print_function。

10. 利用 caniusepython3 供给的工具,检查哪些软件依靠项会阻止支持 Python 3 。

11. 迁移代码后,请在 setup.py 文件中更新分类器,使其包括 Programming Language :: Python :: 3,以表白代码支持 Python 2 和 3。

12. 经过利用 tox 自动化测试并将此设备与延续集成系统停止集成,以确保代码与 Python 2 和 3 连结兼容。

别的,为了将 Python 2 迁移到 Python 3 代码,NCSC 还倡议利用 2to3 利用法式,该利用法式将尝试自动履行该进程。

总而言之,虽然很麻烦,可是为了连结功用的先辈性,企业或小我开辟者还是不能不挑选迁移到 Python 3。假如想避免迁移进程出现题目,可以参考一些至公司的迁移情况。

关注我并转发此篇文章,私信我“支付材料”,即可免费获得InfoQ代价4999元迷你书!


上一篇:Gulp.js 参考手册,自动化构建利器
下一篇:iPhone有大用处!苹果公布iOS 13.4正式版:一大波儿新功用
温馨提示:
下载好向圈客户端可以随时随地交流学习经验,也可以和圈友发起聊天成为好友
好向圈www.kuaixunai.com是一个专业经验分享交流平台,请提供优质的经验内容分享,拒绝任何广告内容出现,低质量广告内容硬广包含手机号码,微信,QQ或者二维码,网址等形式存在可能会审核不通过 要想被各大搜索引擎尽快收录请做好内容原创工作,才会有更好的推广效果。
返回列表
使用道具 举报
#为什么, #移至, #python
12 条评论
您需要登录后才可以回帖 登录 | 立即注册
糯米糕2017 发表于 2020-3-25 12:55:55 | 阅读全部
没办法,就是不想print加括号啊
使用道具 举报
回复
耳朵进水蜗 发表于 2020-3-25 12:57:05 | 阅读全部
动态类型一时爽,代码重构火葬场。
使用道具 举报
回复
阿布877 发表于 2020-3-25 13:00:57 | 阅读全部
论移植,还是java最好
使用道具 举报
回复
关山瞻月蒲tg 发表于 2020-3-25 13:04:54 | 阅读全部
开玩笑一样的升级。只会越陷越深。
使用道具 举报
回复
kfyk929147 发表于 2020-3-25 13:10:42 | 阅读全部
因为两个根本.是两种语言。
使用道具 举报
回复
专喷脑残蓝qd 发表于 2020-3-25 13:16:34 | 阅读全部
2和3共存的时间太久了,所以之前大家都是不着急,各种依赖都是用2写的。突然要换,肯定是会有各种问题的
使用道具 举报
回复
修身之人油 发表于 2020-3-25 13:19:38 | 阅读全部
这就是java一直牛比的原因,哪怕有人说它臃肿,有人说它啰嗦,但是它就是这么强大
使用道具 举报
回复
123465597 发表于 2020-3-25 13:24:39 | 阅读全部
为了print()和 Unicode str,真不如 utf8 的str。
使用道具 举报
回复
坡下泥土中胤 发表于 2020-3-25 13:28:24 | 阅读全部
python3是没希望了,还是等等看python4能不能向下兼容python2吧
使用道具 举报
回复
孤独小孩孤n 发表于 2020-3-25 13:30:32 | 阅读全部
基本都3了,2的历史债该还了
使用道具 举报
回复
你该穿秋裤了 发表于 2020-3-25 13:36:57 | 阅读全部
使用道具 举报
回复
DanielWang2017 发表于 2020-3-25 13:38:28 | 阅读全部
收藏起来
使用道具 举报
回复
相关推荐
广告合作以及侵权投诉客服QQ:1623331347 江苏好向圈信息科技有限公司 网站地图1 网站地图2