Python Python Python (又名 Python 3)
就在 2008 年圣诞节前一周,Python 世界迎来了 Python 的版本 3 的发布。有什么大不了的,嗯?嗯……事实证明确实如此,因为 Python 3 是 Python 的第一个主要版本,从一开始就被设计为与该语言的先前版本不兼容。Python 在 Linux Journal 的读者中很受欢迎(在 2008 年赢得了最受欢迎的脚本语言类别),这样的发展可能会让一些人感到震惊。关于 Python 3 中引入的所有更改的详细描述可以在 “新功能”文档中找到,另一个有趣的来源可以在 pythonology 博客上找到。因此,在本文中,我不打算重复这些材料。相反,我将介绍我对 Python 3 的看法,并讨论 Python 3 对新的和现有的 Python 程序员意味着什么。
Python 3 修复了 2.x 版本中的许多已知问题。已更改的内容类型包括语言中运行不佳、对 Python 程序员造成困扰或在 Python 编程方式中造成不一致的部分。例如,考虑 Python 3 中最明显的变化,这与print有关。在以前的 Python 版本中,print是一个命令,现在它是一个函数。在 2.x 版本中看起来像这样的代码
print "The world is indeed flat."
现在必须在 Python 3 中像这样重写
print("The world is indeed flat.")
从表面上看,这看起来没什么大不了的,直到您意识到几乎每个编写的 Python 程序都至少有一个print命令,如果不是很多。为了减轻调整每个 2.x 版本的负担print命令到 3.0 版本print函数,Python 3 提供了方便的 2to3 转换工具。假设上面的代码行在一个名为 flat.py 的文件中,此命令行列出了将此代码移动到版本 3 所需的编辑
$ 2to3 flat.py
要自动应用所需的就地编辑,请使用以下命令行(原始代码保存到 .bak 文件)
$ 2to3 -w flat.py
键入“2to3 --help”以获取可用选项列表。使用 2to3 实用程序在很大程度上使更改为print成为“非问题”,引用 Python 网站上记录的官方更改列表(请参阅资源)。当然,必须提出显而易见的问题:“为什么要引入这样的更改?”和“为什么 Python 开发人员破坏了几乎所有现有的 Python 程序?”。
可以用一个答案来回答这两个问题:因为这样做是有道理的。2.xprint命令总是像函数一样使用,即使它是一个命令,这意味着它与while, if, try, def和else之类的命令归为一类,尽管它可能不应该这样做。在 Python 中,所有函数名称都有一个尾随 (),例如int(), input(), float(), range()等等。由于print始终更像是一个函数而不是一个命令,因此它变为print()在 Python 3 中,这当然很有道理,即使它破坏了所有这些代码!
Python 3 充满了像这样的“这样做是有道理的”更改。例如,改进后的input()取代了 2.x 版本raw_input(),它已经消失了。对于xrange()也是如此,它已被range()取代。与print()一样,2to3 转换工具会捕获这些更改,并在指示执行此操作时自动对您的代码进行必要的调整。
关于 Python 3 的一件好事是它可以与以前的版本一起安装。这允许您在有意义的时候使用和迁移到版本 3,甚至允许在同一台机器上混合使用 Python 2 和 3 脚本。当然,不要像我在我的 Xubuntu 系统上所做的那样:我要求 Python 3 安装程序将版本 3 设置为我的默认 Python。我这样做之后,一切都停止工作了。GUI(以及其他地方)中的大多数 Xubuntu 系统管理脚本都使用 Python,并且它期望 Python 是版本 2。当我的 Xubuntu 桌面尝试执行任何与系统管理相关的操作时,什么也没有发生。
罪魁祸首是 Python 3 对其异常处理机制引入的更改。较新的语法更简洁,并且不再支持较旧的语法。除非您的 Python 2.x 代码在版本 2.6 上运行(该版本已经向后移植了许多版本 3 的功能和语法更改),否则您的代码将崩溃。由于我的 Xubuntu 运行的是 2.5.2,因此异常处理代码为我的绝大多数内部系统管理脚本造成了语法错误,它们只是停止工作了。当然,Xubuntu GUI 没有告诉我任何这些,各种实用程序似乎只是什么也不做,这真是令人恼火。直到我尝试从命令行运行实用程序时,我的问题才变得清楚:我要求 Python 3 运行未更改的 Python 2 代码,并且它 - 非常正确地 - 抱怨了。当我保留/usr/bin/python到/usr/bin/python3,然后重新安装默认的 Xubuntu Python 包(使用“sudo apt-get install python”),我的系统管理实用程序又开始工作了。
如果您的现有代码没有使用第三方库,您可能会感到惊喜。由于 Python 是“自带电池”的脚本语言,因此所有标准库都已移植到 Python 3。这对 Python 程序员来说是一个巨大的优势,因为标准库确实非常丰富。
在 2009 年春季,我对一些最大的 Python 第三方项目进行了一次快速调查,试图确定每个项目的 Python 3 移植工作进展如何。我查看的项目是:Django(Web 应用程序框架)、Twisted(网络编程库)和 SciPy/NumPy(计算技术)。以下是每个项目的 Python 3 状态的简要摘要。
在 docs.djangoproject.com 上搜索在线文档存档中的“Python 3”没有找到匹配的文档。常见问题解答提供了 Django 在“一两年内”在 Python 3 上运行的可能性,这主要是因为需要在多个 Python 上支持多个 Django 版本。当然,这并不是说在这方面没有取得任何进展。Python wiki 包含 一项此类努力的描述,旨在开发一个 Django 代码库,该代码库可以在支持该框架的所有 Python 版本(包括 Python 3)上运行。这种努力(维护一个支持 Python 3 和以前版本的单一代码库)是 Python 3 开发人员不赞成的,但这并没有阻止 Django 开发人员尝试。它仍处于早期阶段,进展缓慢,但这预示着未来会很好。如果 Django 世界内对这样的努力给予更多支持,那么也许与版本 3 兼容的版本可能会比我们想象的更早到来。
这个强大的网络引擎支持 Python 的 2.x 版本。在项目网站上很难找到有关移植到 Python 3 的信息,但我找到的信息似乎表明 Twisted 开发人员倾向于单一代码库解决方案(这反映了 Django 开发人员的早期努力)。显然,Twisted 项目有大量且不断增长的依赖于它的项目,而迁移到新的、不兼容的 Python 并非易事。同样,像 Django 一样,并且从我所能确定的来看,Twisted 开发人员设想在“未来几年内”的某个阶段迁移到 Python 3。
SciPy/NumPy 组合为使用 Python 的科学家提供了一组出色的计算资源。为了实现满足如此苛刻用途所需的性能,SciPy 和 NumPy 都利用了 Python 随附的低级 C API。您可以想象,此 API 已针对 Python 3 进行了更改,这给依赖它的现有 Python 项目带来了麻烦。当然,这并没有阻止 NumPy 开发人员 尝试。工作处于早期阶段,并且依赖于其他一些“上游”项目的努力,因此预计进展会缓慢但稳定。目前,SciPy/NumPy 仅是一个 2.x 版本的 Python 项目。
如果您的自制 Python 代码没有使用任何第三方代码,即仅使用标准库,您可以使用 2to3 转换工具将绝大多数代码移植到 Python 3。《Python 3 新特性 指南》建议首先移植到版本 2.6(假设您尚未这样做),然后打开 2.6 版本的版本 3 兼容功能和警告。只有当您的所有测试都通过后,您才应该考虑使用 2to3 移植到版本 3。
我想给出的一个建议与我总是给我的编程学生的我最喜欢的建议有关:尽可能晚地编写代码。当我给一个编程学生一个问题(无论大小)时,学生立即想要开始编码。我努力迫使学生抵制这种冲动,告诉他们最好先花时间理解问题,然后,只有这样,他们才应该考虑编写代码。通过将编写代码的时间推迟到最后一刻,我希望学生实际编写他们需要的代码,而不是编写最终被丢弃的代码(因为它不符合他们项目的需求)。因此,对于将现有代码迁移到 Python 3 也是如此:在最后一刻之前不要将代码移植到 Python 3。也就是说,如果您现在不需要 Python 3 的功能,请不要移植您的代码。Python 的 2.6.x 版本将在很长一段时间内存在,并且在可预见的未来将得到维护(错误修复)。
另一种策略可能是根本不移植。如果您的 2.x 版本代码运行良好,请保持原样。由于 2.x 版本和 3 可以共存,您可以决定使用 Python 3 编写任何新代码或系统,并决心根据需要维护您现有的 2.x 代码库。
如果您使用大量第三方代码,情况会变得更加棘手,因为如果您使用的第三方代码仍然以 Python 的 2.x 版本为目标,您将很难移植您的代码。一种策略 - 实际上是常识 - 可能是当您依赖的第三方代码迁移到版本 3 时,尽快将您的代码迁移到版本 3。
随着时间的推移,为 Python 3 创建(或更新)的第三方模块列表 正在增长。这只能是一件好事。Python 2.6.x 版本已变为“仅错误修复”,因为较旧的 Python 中没有添加任何新功能。所有新功能和所有创新都将发生在 3.x 项目中。即使现在还处于早期阶段,Python 3 也有望成为一种有价值的跨平台编程技术。Python 3 具有旧版 Python 的所有优点,还有一些其他优点。您是否以及何时从版本 2.x 迁移到 Python 3 仍然是一个个人决定。当然,如果您正在重新审视 Python,请务必试用版本 3,并且不要在语言的版本 2.x 上浪费任何精力。Python 3.1 最近已发布,版本 3.0 现在已被弃用。版本 3.1 包含一些新功能和许多错误修复。
Python 3 编程:Python 语言完整入门,作者 Mark Summerfield,由 Addison-Wesley 出版(2009 年),ISBN:(978-)0-13-712929-7 是(在撰写本文时)为数不多的以 Python 版本 3 为目标的书籍之一。如果您是 Python 的新手,本书是一个很好的起点,也是对 Python 习惯用法和实践的极佳介绍。[请参阅本书的 摘录]
核心 Python 编程,作者 Wesley J. Chun,由 Prentice Hall PTR 出版(2007 年),ISBN:(978)-0-13-226993-3 被许多人认为是所有 Python 事物的最佳入门书。尽管 Chun 的书侧重于 Python 的 2.x 版本,但它仍然是所有 Python 程序员的虚拟宝藏,即使对于那些计划使用 Python 3 的程序员也是如此。只需注意,您必须“转换”一些示例代码才能使其在最新的 Python 下运行。Chun 计划在“某个阶段”更新本书以支持 Python,但是,不要期望在 2010 年之前进行更新。
Paul Barry 在爱尔兰卡洛理工学院任教。他正努力创作他的第三本书,Head First Programming,该书是他与 David Griffiths(Head First Rails 的作者)合著的。Head First Programming 预计将于 2009 年底由 O'Reilly Media 出版。