BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Python 3.0之破旧立新

| 作者 Ze'ev Bubis 关注 0 他的粉丝 ,译者 李明(nasi) 关注 0 他的粉丝 发布于 2009年3月29日. 估计阅读时间: 7 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

Python 3.0(又名Python 3000)在三个月之前终于发布(2008年12月3日)。自Python之父Guido van Rossum开始展望这个全新的、革命性的Python版本,已经过去了近9年光景。Python 3.0打破了与旧有版本的向后兼容性。

在2007年的一篇博文中,Guido写到了Python 3.0的构思

一直以来,除非要打破向后兼容性,否则很多缺陷和错误都无法修复。因此,Python 3000将会作为第一个放弃向后兼容性的Python版本,目的就是要让Python向着最好的语言前进。

在稍后的一次访问中,Guido叙述了接下来的事情

大约在三年之后,我开始切实地投入进来,开始真正的设计它,时间大约就在我加入Google之后,对于Python我有了更多的时间。很长一段时间里,项目推进的很快,很多人因此而激动。我每年都在包括PyCon和Euro Python等很多会议上做演讲。在过去的12个月里,在开发者社区搞定了全部的细节并已经准备好发布了以后,虽然不是全部的投入,但是我花了很大一部分精力在上面,坐下来好好享受这个过程。

尽管Python 3.0打破了对Python 2.x的向后兼容性,但是其发布和Python 2.6的发布一道,为开发者提供了一种便捷和安全的方式,来实验各种新的特性。和之前的Python版本一样,Python 2.6保持了对之前版本的全兼容,而且还包含了Python 3.0的新玩意(一些新特性需要通过“from __future__ import”来启用)。

Python 3.0的新特性

Guido说Python 3.0最出色的特性便是,“对Unicode的更好的支持,对各种'垃圾'进行清理”。而其中对unicode的全面支持则是变革的一个主要方面。Guido写到

所有的文本都是Unicode;然而,编码过的Unicode的会以二进制的数据来表示…… 基于这个哲学来修改的结果是,只使用Unicode的代码清爽了许多,编码和二进制数据都需要为此做出修改。这个修改是正面的,因为在2.x的世界里,大量的bug都是因为以编码的文本和未编码的文本混杂在一起而产生的。

尽管Python 2.x也支持Unicode,但是它是通过一个(旧有的)str类型和一个(新的)unicode类型来实现的。在Python 3.0之中,所有的字符串都是unicode的(str就是unicode字符串),并引入了一个叫做bytes的新类型来处理字节序列。

Python 3.0的其他修改包括:

  • Print是一个函数 ─ print语句已经被一个print()函数所替代。通过关键字参数来替代旧有print语句绝大多数的特殊语法(可以在Python 2.6中通过from __future__ import print_function来进行试验)。更多请参阅PEP 3105 ─ 让print变为函数
  • 用迭代器来替代列表 ─ 一些知名的API将不再返回列表。而字典的dict.iterkeys()、dict.itervalues()和dict.iteritems()方法将会移除,而你可以使用.keys()、.values()和.items(),它们会返回更轻量级的、类似于集合的容器对象,而不是返回一个列表来复制键值。这样做的优点是,可以直接在键和条目上进行集合操作,而不需要再复制一次。
  • 整型数 ─ 移除了含糊的除法符号('/'),而只返回浮点数。在以前的版本中,如果参数是int或者是long的话,就会返回相除后结果的向下取整(floor), 而如果参数是float或者是complex的话,那么就会返回相除后结果的一个恰当的近似。在2.6版本中可以通过from __future__ import division来启用这项特性。更多请参阅PEP 238 ─ 修改除法操作符
  • 大量的语法修改

目前已经做了大量的工作,来使得向3.0版本的迁移尽可能的简单。很多新特性被反向移植到了2.6版本中,而且有一个新的命令行开关,可以打开对即将在Python 3.0中移除的特性的警告。你可以使用该开关来运行代码,来看看要将代码移植到3.0需要做多少工作。另外,有一个新工具叫做“2to3”,可以阅读Python 2.x的源代码,并执行一系列的修补器,来将代码转换为Python 3.x的代码。Guido还补充到

事实上,2to3工具有一种模式,是可以不直接修改代码的,而默认情况下它是会的。你可以让它输出标准的diff来看看修改了什 么。如果需要的话,你可以逐个文件的去审校,然后再决定是否做出修改。“哦,没错,它这么做是对的。” 或者经过仔细审校以后,发现实际上这个工具犯了错误。你可以手工地修复这个文件,来重新进行修补。这样的话,工具依然会帮你节省大量的工作。这在Python 2.6到3.0的转换中是有先例的。

是应该选择Python 2.6还是3.0来进行开发?Guido这样说到

… 决定选3.0抑或2.6是一个比较个人的选择。此时此刻,你不会为作为一个保守者而承担任何风险。2.6依然会和3.0一样,会受到核心Python开发者的良好支持。同时,我们也不会稍稍降低3.0的质量和重要性。因此,如果你并没有外部需求,比如说依赖某个包或者第三方软件,而它们还没有被移植到 3.0,或者你并不是在一个大家都用2.x的环境中的话,那么就没有必要裹足不前了。

Python及其社区最被人称道之处,就在于其做到了保守地前行,每个版本之间都做到了良好的向后兼容性。现在,Python社区要做些与众不同的事──通过牺牲向后兼容性来开发一个更好的语言版本。Java社区也一直有这样的想法,但是自从1.2版本(又名 Java 2)之后,“糟糕和丑陋之处”便不敢再去修正,怕的便是会破坏现有的代码。

查看英文原文:Python 3.0 Breaks with the Past

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT