关于Python 3的一些想法

Python社区的朋友们、开发者们,我们需要谈谈了。2008年12月3日,Python 3.0 首次发行。当时人们普遍认为,距离Python3能真正被所有人广泛使用,还需要一段很长的时间。当时大家的估计是五年。而现在距离当时,正好已经五年了。

从Python 3刚刚发行开始,到之后的数年间,我都一直在为Python 3的出现感到激动不已,并且不断努力推广Python 3的使用,还将我原来的项目迁移到Python 3之上。在过去的一两年里,我的每一个新项目,都是从一开始就使用到了Python 3 进行开发的。

可是大概六个月以前,我开始反思自己这样做是否真的正确,并且渐渐地,我对Python 3 的激情变为了绝望。

在从Python2过度到Python3的最初几年里,大家都觉得只有几个开源项目需要迁移而已。可是后来,需要迁移的项目就像潮水般地出现了。例如在Django中,要实现这样的迁移,我们就需要一个新的WSGI的规范,还需要对数据库驱动进行迁移,接下来我们才能进行迁移,再接下来,用户们才能开始迁移。

目前为止,Django和大多数应用生态系统(app ecosystem),以及Numpy和其他科学生态系统(scientific ecosystem) 都能够在Python3上运行了,Python3的几个新版本也已经发行了,可是用户们却一直没怎么使用它们。

Python package index 的下载统计数据显示,Python3的下载量在总下载量中所占比例不到2%。更加糟糕的是,现在几乎没有用Python3写出的代码。虽然我的所有新代码都支持Python3,但是我却会locally将Python3和Python2代码一起运行、测试。只有Travis CI 帮我在Python3下运行代码。所以,我目前还没有完全使用Python3写成的代码。在一些使用Python作为代码库语言的公司里,我跟一些负责人员有过交流,我发现基本上没有人在使用Python3,而且也没人打算进行Python版本的迁移。

实际上,早在Python3.1发行时,许多人就都认为,用户们会为了使用其中新特性和新标准库而进行Python版本升级了(当然,现在的Python3.3 功能也十分的强大)。但是几乎99%的用户们都没有使用这些新功能。所以当我们告诉用户们,“Python3比Python2更加好用!”,我们实际上相当于什么也没说,因为Python3的这些新特性根本没有帮到他们的忙。

除了上述的问题外,Python3的低使用率也非常不利于Python语言本身的发展,因为用户与开发者之间的反馈机制几乎不复存在了。现在,只有很少的人在使用Python3,并对其中新增加的特性给出反馈。而这样少量的反馈可能根本无法代表大多数Python社区用户的意见。在我们不断发行Python3.X的过程中,这一问题也变得越来越严重。现在我们仍在一些原有特性的基础上增加新特性,但是在设计这些特性时,我们完全得不到它们在实际广泛使用后反馈的指导。

为什么那么少人使用Python3呢?

首先,我认为是大家的紧迫感太少了。很多年前,在我还不会编程的时候,Python2还在发行的时候,开发者就已经决定要最终发行Python3了。现在回头想想,这样的决定无疑是错误的,因为整个Python社区因此满足于使用Python2,并没有升级到Python3的紧迫感。因为缺乏紧迫感,大家最后懒惰了起来。

其次,我认为还是因为Python3从根本上说就不足以使人激动不已。Python3里并没有人们特别希望出现的功能,比如去除被人广为诟病的GIL或者更好地提高性能(也因为如此很多人在使用 PyPy)。相反,很多Python3加入的功能显得多余。例如,Python3增加了许多新标准库(其中大部分基本可以通过pip install实现),而至于新增加的小型清理功能,很多经验丰富的Python程序员因为习惯原因,一直努力避免使用它们。很明显,还没有人愿意停下手中的开发,而去花时间进行版本升级,特别是现在看来Python2还能继续使用一段时间。

那么现在的情况如何呢?

显然现在我们的处境并不好。首先,最重要的是,我们都要对Python3有更加清醒的认识。具体来说,就是我们要意识到,Python3已经发行数年了,但对大多数开发者而言,Python并没有因此而变得更好。

Python2与Python3间的分歧对整个社区非常不利,我们必须设法将两者结合起来。

对此我有一个建议:可以发行Python2.8版本,并在其中加入Python3的所有新特性。我们将删除那些因为兼容性原因而无法加入Python2.8中的特性,比如使用 str + unicode 时会提示警告,和其他一些不能支持 from __future__ import unicode_literals 语句的情况。我们必须能够让用户在升级的过程中,保证语言使用的一致性。Python3就打破了这种一致性,而现在我们必须弥补这个过错。

当然这仅仅是我个人的建议,问题最终的解决还需要大家提出更多办法。我们必须要把Python2和3之间的分歧填补起来,这种分歧已经随着每次Python3的发行而越来越大了。

感谢 Maciej Fijalkowski 和其他人对这篇文章的校对。

译注:英文原文中 200 多条评论,推荐 Python 程序员 可以去看看。

1 收藏 2 评论

关于作者:马帅

(新浪微博:@聪明magicshine) 个人主页 · 我的文章

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 我用 Python 3 的第一大原因是 Unicode 支持。对 Unicode 支持这么好的语言恐怕只有 Python 3 和 Ruby 了。

    Python 2 也有有限的 Unicode 支持,但是你能想象自带的库(如 argparse)自己就有 Unicode 有关的 bug 吗?不像 Python 3 那样强制 Unicode 就会导致国外的开发者忽略 Unicode 的存在。

    少库又怎么样?自由软件强调互动,真正不行就自己写一个好了。

    我自己写程序用 Python 3,因为我曾经因为 Python 2 的 Unicode 问题调试了整整 12 小时。但是我绝对不会反对 Python 2。

    以下是吐嘈:
    但是现在 Python 的多线程还是一个大坑,PyPy 3k 还没有稳定。再加上 Python 不使用第三方库写网络程序就是折磨(有的时候为了可移植性希望使用最少数量的第三方库),自己的 asyncore 死活不支持 epoll,patch 都给提交了硬是 reject 掉。真希望有第三方实现一套利用 Python 语言配上自己实现的标准库的运行环境啊……

  • 木头lbj 程序员 2014/01/07

    主要受限制还是第三方库没完全跟上吧。
    毕竟2积累了太多了。

跳到底部
返回顶部