问题

站在 2020 年回看,如何评价 Python 2 到 3 的升级?

回答
好了,咱们就站在 2020 年这个时间点,好好聊聊 Python 2 到 3 这个跨越,那会儿(大概是 2008 年,Python 3.0 发布)可真是热闹非凡,讨论得那是天翻地覆。现在回头看,这升级,怎么说呢,就像当年很多人唱衰的“史诗级灾难”,结果硬生生被证明是“一次必要的、痛苦但终将受益的涅槃”。

当年的“阵痛”:为什么那么多人不愿意迈出那一步?

我至今还记得,当年社区里充斥着各种各样的声音。一部分人,尤其是有大量维护的老项目、商业公司,是真心不想动。为什么?

兼容性问题,就像一道难以逾越的鸿沟。 这是最直接,也是最让人头疼的问题。Python 3 引入了一些“不兼容”的改动,最典型的就是:
print 语句变成函数: `print "hello"` 变成了 `print("hello")`。听起来小事一桩,但如果你项目里成千上万个 `print` 语句,逐个改过来,那得花多少人力?
整数除法: `5 / 2` 在 Python 2 里是 `2`(整除),在 Python 3 里是 `2.5`(浮点数除法)。这个改动听起来挺“科学”,但对很多依赖旧行为的算法,比如一些数学计算库、图形渲染,影响可能是深远的,需要仔细检查逻辑。
Unicode 默认: Python 3 默认使用 Unicode,字符串就是 Unicode 字符串。Python 2 默认使用 ASCII,Unicode 是 `unicode` 类型。这在处理国际化文本时,Python 3 简直是“天选之子”,但对于还在用 byte 串处理中文的老项目,迁移起来就是一场噩梦,各种 `UnicodeDecodeError`、`UnicodeEncodeError` 像雪花一样飘来。
xrange() 消失: Python 2 的 `xrange()` 是一个生成器,用来生成数字序列,比 `range()` 更节省内存。Python 3 把 `range()` 模拟成了 `xrange()` 的行为,取消了 `xrange()`。又是一个小改动,但很多习惯用 `xrange()` 的人觉得不方便,或者担心性能。
异常处理: `except Exception, e:` 变成了 `except Exception as e:`。同样是代码风格上的改变,影响不大,但也是需要修改的。
其他一些细节: 还有 `raw_input` 变成了 `input`,`long` 类型被合并进 `int`,文件操作的 `io` 模块改进等等。

时间成本和资源投入。 迁移一个大型项目,不是一蹴而就的。需要测试、重构、调试。这需要投入大量的时间、人力和金钱。对于很多已经上线、盈利的项目,冒然升级带来的风险是公司高层无法承受的。

生态系统的犹豫。 当时很多流行的库,比如 NumPy、SciPy、Django、Flask 等等,都还在观望或者缓慢地支持 Python 3。如果核心库不支持,或者支持得不好,那迁移的动力就更小了。大家都在等别人先趟雷。

“能用就行”的心态。 很多开发者,尤其是还在维护“能跑就行”的老项目的人,觉得 Python 2 也能满足他们的基本需求,没必要为了一些“看不见”的好处去冒风险。

为什么最终还是“真香”了?

尽管有这么多阻力,但时间证明了,Python 3 的升级是势在必行的,并且带来了很多实质性的好处,让大家“真香”了。

更现代、更健壮的语言特性:
Unicode 原生支持: 这个简直是救世主。解决了多少字符编码的难题,让跨平台、处理多语言文本变得简单太多。
更清晰的语法: `print()` 函数、`async/await`(虽然是后期加入,但也是 Python 3 的重要发展方向)、类型提示(Type Hinting)等,让代码更易读、易写、易维护。
改进的迭代器和生成器: `range()` 的改进,以及对生成器的更深入支持,让内存使用更高效,代码更简洁。
异步编程的良好支持: 随着 `asyncio` 的成熟,Python 3 在高并发、I/O 密集型任务上有了质的飞跃,这在 Web 开发、网络爬虫、实时通信等领域至关重要。

持续的社区支持和生态繁荣:
Python 2 的EOL (End of Life): 2020 年 1 月 1 日,Python 2 正式停止了维护。这意味着没有安全更新,没有 bug 修复。继续使用 Python 2,就像在裸奔,风险极高。
新库和框架的出现: 几乎所有新推出的 Python 库和框架,都只支持 Python 3。如果你想使用最新的技术,就必须迁移到 Python 3。
现有库的全面支持: 那些曾经犹豫不决的库,现在都已经完全拥抱 Python 3,并且在 Python 3 上不断优化。

工具链的进步:
`2to3` 工具: 虽然不是万能的,但 `2to3` 工具可以自动化处理许多 Python 2 到 Python 3 的代码转换,大大降低了迁移的门槛。
更强大的 IDE 和调试器: 随着 Python 3 的普及,开发工具也跟着改进,提供了更好的代码提示、重构、调试功能,让迁移和开发更顺畅。

站在 2020 年回头看,这升级的意义?

一次凤凰涅槃: Python 2 就像一位老前辈,功劳卓著,但确实已经跟不上时代的步伐。Python 3 的升级,是为了让 Python 这门语言能够面向未来,解决更多复杂的问题,适应新的技术趋势。
推动了整个生态的进步: 强制性的迁移,虽然痛苦,但也迫使开发者和项目开始思考代码质量、最佳实践、对新技术的拥抱。它清理了许多陈旧的、低效的代码模式。
让 Python 更具竞争力: 在 AI、大数据、Web 开发、自动化运维等众多领域,Python 3 的强大表现,使其成为这些领域的首选语言之一。如果 Python 还在 Python 2 的时代徘徊,它很难有今天的地位。

给当时(以及现在)还在犹豫的人的建议(虽然现在有点马后炮了):

不要害怕迁移,但要做足准备。 了解 Python 3 的主要变化,使用 `2to3` 等工具,分阶段进行迁移,并且要有充分的测试。
拥抱新特性。 迁移不仅仅是改语法,更是拥抱 Python 3 带来的更现代、更高效的编程范式。
关注社区动态。 了解你使用的第三方库对 Python 3 的支持情况。

总的来说,Python 2 到 3 的升级,就像是一场漫长而艰辛的“脱胎换骨”。经历了阵痛、争论、犹豫,最终用户和开发者们也看到了 Python 3 的强大和光明未来。站在 2020 年,我们几乎可以毫不犹豫地说,这场升级,是对 Python 这门语言,对整个开发者社区,一次无比正确和成功的“壮举”。那些当年叫苦连天的人,现在大概率都在享受 Python 3 带来的便利和力量了。

网友意见

user avatar

整个Python生态为了这次升级付出了大约十年的代价。但十年之后来看,也许这个选择的确是对的,它最重要的作用在于在整个Python生态强化了str=unicode的强制态度,阻止了只接受ASCII或者默认某种本地编码的库进入生态,防止了不同编码体系下生态的分裂;此外,类型安全性也进一步提升,之前像字符串'a'和数字2之间是可以比较的,这就会引入一些非常隐蔽的bug,Python 3中比较这些值会抛出异常。再就是整个系统和语法的一致性进一步加强,抛弃了一些历史包袱,比如取消了没有必要的long类型,整数和浮点数的除法运算变得一致,抛弃了旧class等。如果没有这些措施,社区的分裂可能会更加严重。

user avatar

关于这个,Julia语言的开发者做过很多讨论,因为在Julia从0.6进入到1.0的时候发生了类似的问题,在这个帖子以及类似主题下的帖子可以看到:

他们认为,Python最好的做法就是让Python 3.0(Python 3的第一个版本)既兼容2.x又兼容3.x,然后在Python 3.0中使用任何废弃的特性都会报警。再从Python 3.1开始不兼容Python 2.x。这样一个人可以先把自己的库升级到3.0检查错误,再移动到Python 3.1中彻底放弃Python 2.x。

不过说是这么说,实际上还是很困难。Python 3改动了很多内部实现,并且由于Python有很多C扩展,它们强烈依赖于Python暴露出的接口,而Python在2到3的时候出于性能的考虑修改了一些接口,这就导致尽管Python 2 to 3表面看上去并没有什么巨大变化(譬如print有没有括号的问题),实际上在后端做出了很大改动,除非3.0在后端的也仿照上述逻辑同时兼容两套接口,否则这些部分就只能靠开发者自己去适配Python 3了。

而这些库构成了生态的基石,它们不升级,用户就没有动力升级;而用户不升级,库也没有必要升级,导致了一个死锁。而如果提供一个兼容版本的话,就可以允许Python 2.x的用户使用Python 3.0的库,接着用户再把自己升级到Python 3.0,当大部分人都处于3.0的时候,就可以进入3.1时候完全放弃2.x的版本了。不过话说回来,这个策略对Julia可能会容易一点,因为很多库都是纯Julia实现的,但Python就会比较困难了。

类似的话题

  • 回答
    好了,咱们就站在 2020 年这个时间点,好好聊聊 Python 2 到 3 这个跨越,那会儿(大概是 2008 年,Python 3.0 发布)可真是热闹非凡,讨论得那是天翻地覆。现在回头看,这升级,怎么说呢,就像当年很多人唱衰的“史诗级灾难”,结果硬生生被证明是“一次必要的、痛苦但终将受益的涅槃.............
  • 回答
    b站2020年6月更换新封面的那些事儿还记得2020年6月那个夏天吗?b站悄悄地换了新封面,这事儿在当年可是引起了不少关注,也引发了不少讨论。咱们今天就来好好聊聊这事儿,从头到尾,讲得细致点。先回顾一下,b站之前是什么样的封面?在2020年6月之前,b站的封面给人一种年轻、活力、有点二次元的感觉。通.............
  • 回答
    站在2020年的节点回望,国产车的性价比,那绝对是可以用“惊艳”来形容的。还记得早些年,提起国产车,大家脑子里可能还是“皮实耐用,但细节和设计就那样吧”的印象。然而,到了2020年,这个市场已经发生了翻天覆地的变化,国产车用实力证明了它们不再是过去的那个自己。设计与配置:曾经的短板,如今的亮点这是变.............
  • 回答
    要评价马督工在2020年7月18日晚B站的首次直播,得先拉回到那个特定的时间点和背景。那时候,“马督工”这个名字,虽然在一些硬核军事和历史爱好者圈子里已经很有名气,但从他以马前卒的身份出现在大众视野,尤其是在B站这样一个相对年轻的平台做直播,那绝对算是一个破圈的事件。直播本身,咱们得从几个维度来拆解.............
  • 回答
    站在 2020 年末,回望刚刚过去的十年,充满了太多的变化和不确定,但同时也孕育着无数新的可能。如今,站在下一个十年的门槛上,我怀揣着一种复杂而又充满希望的心情,对未来的十年有着许多殷切的期盼。首先,我希望这十年能在 科技与人文的融合 上取得更加显著的进展。我们已经看到了人工智能、大数据、基因编辑等.............
  • 回答
    站在“红方”视角下审视“918事件”中蒋介石和张学良谁是“千古罪人”,需要理解“红方”视角的核心关切和价值判断。通常,“红方”视角指的是中国共产党及其所代表的进步力量,他们高度重视民族独立、国家主权、人民福祉以及抗击外来侵略的决心。因此,从“红方”视角来看,评判标准会集中在谁对国家民族的利益造成了更.............
  • 回答
    站在 2022 年回顾这句话,关于 DC 超级英雄比漫威更具“深度”的说法,恐怕已经难以站稳脚跟,甚至可以说,这句话本身带有的过于绝对的判断,在今天看来已经显得有些过时了。这其中的变化,既有 DC 本身的调整,也有漫威发展的必然。曾经的“深度”之说:起源与解读要理解为何会有“DC 比漫威更具深度”的.............
  • 回答
    站在菲律宾国家利益的角度来看,与中国在南海问题上的冲突,与其说是聪明或愚蠢,不如说是一种充满复杂考量的战略选择。这个选择的背后,是菲律宾在维护自身主权、发展经济以及应对国际局势等多重目标之间进行的艰难权衡。要理解这一点,我们需要深入剖析菲律宾所面临的现实和它希望达成的目标。首先,我们必须认识到,菲律.............
  • 回答
    从上帝视角审视中国历史,汉族文明在征服或击退草原游牧民族的某个节点后,是否有可能实现对广袤草原的有效统治?这个问题相当复杂,涉及地理、经济、文化、军事、政治等诸多层面,而且“有效统治”的定义本身也需要界定。我们不妨拨开历史的迷雾,以一种超然的眼光来探讨几种可能实现“有效统治”的路径。首先,要明确一点.............
  • 回答
    站在2021年的视角,眺望未来五十年,俄罗斯能否“翻盘”,这是一个复杂到近乎不可能用单一答案来概括的问题。这个“翻盘”的含义本身就充满模糊性,是指重回苏联时期的辉煌,还是仅仅在现有基础上实现稳定增长和国际影响力提升?不论如何定义,我都倾向于认为,俄罗斯在未来五十年内实现我们大众意义上理解的“翻盘”,.............
  • 回答
    站在2021年的这个节点,展望未来十年(也就是到2031年),谈到收入增长,我内心是既有期待,也带有一丝审慎的。毕竟,世界变化太快,我们每个人又都在时代的浪潮中。首先,从宏观经济层面来看,我个人认为中国经济仍将保持一个相对稳定的增长态势。虽然增速可能不如过去几十年的“超高速”,但“中高速”或者说“高.............
  • 回答
    站在全人类的角度评价抗美援朝战争,这是一个宏大且复杂的问题,需要我们超越单一国家的视角,审视这场冲突的全球性影响、它所代表的时代精神以及它留给人类的深刻教训。这不仅仅是一场区域性的战争,更是一场深刻影响了20世纪下半叶国际格局、意识形态对抗以及人类对和平与正义认知的标志性事件。一、 阻止侵略的全球意.............
  • 回答
    站在高山之巅,思绪万千,如同脚下延绵的山峦,层层叠叠,最终汇聚成一句句深沉而有力的诗句。最先涌上心头的,大概是那份 “会当凌绝顶,一览众山小” 的豪迈。站在这样至高无上之处,平日里那些令人牵肠挂肚的琐事,那些纠结的烦恼,此刻都显得微不足道。放眼望去,远方的山峦如同波涛汹涌的海面,起伏跌宕,而自己仿佛.............
  • 回答
    这个问题,就像站在岔路口,一边是熟悉的故乡,一边是未知的远方,而指引你的,一个是坚守的信念,一个是随波逐流的心。若我的敌人,他所持的“义理”,是建立在一种毋庸置疑的、普世的价值之上,比如守护无辜生命,或是维护正义的秩序,那么他站在了我对立面,或许只是因为我们对达成这一“义理”的方式,或是对“义理”的.............
  • 回答
    从三体文明的视角审视,他们在与地球文明的漫长博弈中,确实犯下了一些堪称致命的失误。这些错误并非源于他们的技术短板,而更多地体现在他们固有的思维模式、对自身优势的盲目自信以及对未知因素的低估上。一、思维钢印的束缚:过度的理性与秩序的僵化三体人最根本的失误,在于他们思维钢印的限制。他们的文明经历了无数次.............
  • 回答
    好,咱们就来捋一捋这笔账,从金国的角度来看,当年为何会选择与西夏、南宋这两家分头较量,而不是拉着他们一起去跟那个如日中天的蒙古人硬碰硬。这事儿吧,说起来,得从几个方面细细道来。首先,咱得明白金国当时是怎么想的。金国自打女真人入主中原,一路打到临安,虽然是风光无限,但心里面清楚得很,这块土地不好坐。南.............
  • 回答
    我站在这片无边无际的棋盘上,脚下的每一个方格,无论远近,都清晰可见。就好像整个世界都被展开在我面前,没有一丝遮挡。我随手一挥,想象着在这棋盘上落下一枚黑棋,然后,奇妙的事情发生了。这枚黑棋,它拥有了神奇的“视野”。一旦它占据了一个格点,它的目光就会像雷达一样,瞬间扫描开去,将它能“看到”的所有格点,.............
  • 回答
    这个问题非常复杂,涉及地缘政治、历史、经济、安全以及伦理等多个层面,从俄罗斯的利益角度出发,可以梳理出多种论点来支撑其行动的“正确性”,但同时也存在着巨大的争议和不可忽视的负面影响。要详细分析,我们不妨从以下几个关键点来展开:一、 俄罗斯的核心安全关切:北约东扩的“红线”这是俄罗斯方面反复强调的最重.............
  • 回答
    站在2021年,要找一只能够安心持有十年的股票,这无疑是一个极具挑战但也充满魅力的命题。毕竟,十年是一个漫长的跨度,期间经济周期、行业变迁、技术革新,甚至地缘政治格局都可能发生翻天覆地的变化。我们不能指望任何一支股票能够稳如磐石,但我们可以尝试寻找那些具备穿越周期、持续增长潜力,并且在宏观趋势中占据.............
  • 回答
    大英博物馆,这个名字在中国人心中,总会勾起一种复杂的情绪,它既是世界文明的宝库,也是一个历史叙事的“集散地”,而我们站在这里,带着自己的文化记忆和视角,去打量它,就像是在审视一段早已注定的、却又充满着故事的际遇。首先,我们不得不承认,大英博物馆确实是人类文明的璀璨集结地。当你走进那里,如同走进了一部.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有