为什么人们会犹豫使用Python 3?


220

Python 3于2008年12月发布。从那时起已经过去了很多时间,但是直到今天,许多开发人员仍在犹豫使用Python3。甚至流行的框架(如Django)仍不兼容Python 3,但仍依赖于Python 2。

当然,Python 3与Python 2有一些不兼容,有些人需要依靠向后兼容。但是,对于大多数项目来说,Python 3的存在时间是否已经足够长,以至于大多数项目都无法切换或开始使用Python 3?

有两个竞争版本有很多缺点。需要保持两个分支,学习者的困惑等等。那么,为什么在整个Python社区中对于切换到Python 3如此犹豫?


3
从Python 2开始真的有这么多新项目吗?还是像Django这样的历史悠久的项目?
— Carson63000

3
您可以引用其中的一些讨论/资料吗?
— 迈克尔·复活节

12
@Michael Easter-他不必。只需检查SO上的python标签即可;很多人认为“学习2.x,尚未准备好3.x”。
— Rook

5
您没有看到Python 3耻辱墙吗?
— 2012年

Answers:


248

请注意,我不再更新此答案。我在http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html的个人网站上有更长的Python 3问答环节。

先前的答案:

(状态更新,2012年9月)

我们(即Python核心开发人员)预测Python 3.0发行时,将3.x变成大约2.x系列新项目的“默认”选择大约需要5年。该预测就是为什么2.7版本的计划维护期如此之长的原因。

最初的Python 3.0版本还发现了一些关键问题,它们的IO性能不佳,导致实际上无法用于大多数实际目的,因此从2009年6月下旬发布Python 3.1开始时间表是比较有意义的。 IO性能问题也是没有3.0.z维护版本的原因:没有充分的理由要有人坚持使用3.0而不是升级到3.1。

在撰写本文时(2012年9月),这意味着我们目前距离过渡过程还有3年多的时间,而且这种预测似乎仍在轨道上。

尽管人们在输入 Python 3代码时经常受到语法变化(例如print变成函数)的咬伤,但这实际上并不是库移植的麻烦,因为自动2to3转换工具可以很轻松地处理它。

实际上,最大的问题实际上是一个语义上的问题:Python 3不允许您像Python 2那样快速随意地使用文本编码。这既是它相对于Python 2的最大好处,也是移植的最大障碍:您必须解决 Unicode处理问题才能使端口正常工作(而在2.x中,许多代码静默地生成了错误的数据,非ASCII输入,给人以工作的印象,特别是在非ASCII数据不常见的环境中)。

甚至Python 3.0和3.1中的标准库仍然存在Unicode处理问题,因此很难移植很多库(尤其是与Web服务相关的库)。

3.2解决了许多此类问题,为Django等库和框架提供了更好的目标。3.2还带来了wsgiref3.x 的第一个工作版本(用于Web服务器和用Python编写的Web应用程序之间的通信的主要标准),这是在Web空间中采用的必要先决条件。

现在已经移植了NumPy和SciPy之类的关键依赖项,例如,并已安装了安装和依赖项管理工具zc.buildout,pip并且virtualenv可用于3.x。Pyramid1.3版本支持Python 3.2,即将发布的Django 1.5版本包括实验性Python 3支持,以及12.0版本的Twisted网络框架放弃了对Python 2.5的支持,从而为创建兼容Python 3的版本铺平了道路。

除了在Python 3兼容性库和框架方面取得进展之外,流行的JIT编译的PyPy解释器实现还积极地支持Python 3。

用于管理迁移过程的工具也已显着改进。除了2to3作为CPython的一部分提供的工具(现在认为该工具最适合不需要维护2.x系列的应用程序的一次性转换)之外,还有python-modernize,它使用2to3基础结构来定位Python 2和Python 3的(大型)公共子集。此工具将创建一个代码库,借助six兼容性库,该代码库将在Python 2.6+和Python 3.2+上运行。迁移现有的Unicode感知应用程序时,Python 3.3发行版还消除了“噪声”的一个主要原因:Python 3.3再次支持字符串文字的“ u”前缀(实际上并没有这样做)Python 3中的任何内容-刚进行了恢复,以避免对已经正确区分了Python 2中的文本和二进制文字的用户无意间使迁移到Python 3 变得更加困难。

因此,我们实际上对事情的进展感到非常满意-在我们的原始时间框架上还有将近2年的时间,而且整个Python生态系统中的变化都很好地荡漾着。

由于许多项目无法正确地整理其Python包索引元数据,并且一些维护者活动较少的项目也被派来添加对Python 3的支持,因此纯自动化的PyPI扫描程序仍然对Python 3库的状态给出了过分的否定看法支持。

在PyPI上获取有关Python 3支持级别的信息的首选方法是http://py3ksupport.appspot.com/

此列表由Brett Cannon(长期的Python核心开发人员)亲自策划,以解决不正确的项目元数据,源代码管理工具中尚未正式发布的Python 3支持以及具有最新分支的项目或支持Python 3的替代方案。在许多情况下,Python 3上尚不可用的库缺少关键的依存关系和/或其他项目中缺少Python 3的支持会减少用户需求(例如,一旦Django核心框架在Python 3,South和django-celery等相关工具更可能增加对Python 3的支持,并且Pyramid 和 Django 中都提供Python 3支持,这使得在其他工具(如gevent)中实现Python 3支持的可能性更高。

该网站位于http://getpython3.com/,其中包含指向 Python 3的书籍和其他资源的出色链接,确定了一些已经支持Python 3的关键库和框架,还提供了有关开发人员如何从Java 3寻求财务帮助的信息。 PSF将关键项目移植到Python 3。

另一个不错的资源是社区Wiki页面,其中介绍了在为新项目选择Python版本时要考虑的因素:http : //wiki.python.org/moin/Python2orPython3


3
根据最近18个月的进度进行了更新(并明确指出了3.1是第一个真正可行的生产3.x版本,这是由于3.0中的IO性能
— 极差

1
在一定程度上(即我们知道它比2.6中的io子系统要慢得多),但对通用性的影响远比我们预期的要差(此后,我们的IO基准已得到显着改善,因此不会出现类似情况今天发货)
— ncoghlan

6
现在的拟议时间表在2015年似乎并不那么热情:|
— zetah 2015年

1
我看到它的方式(为此我会被一些人付之东流)是在编码方面,Py3在“实用主义超越了纯净度”这一点上违反了Py3(并且至今仍在这样做) :Py3是纯编码的。Py2编码实用。
— 尔根·艾哈德

2
Py3在编码方面仍然很务实(否则我们就不会有suregateescape),我们只是遇到了很多* nix用户,他们不希望了解操作系统接口在Windows,.NET和JVM等平台上的工作方式(包括Android)。我已在developerblog.redhat.com/2014/09/09/上对此进行了详细介绍 。主要的影响在于“错误不应悄无声息地传递”,因为我们将依赖于数据的错误(这些错误将产生mojibake的错误更改为结构类型错误)抱怨混合二进制数据和文本数据。
— ncoghlan 2015年

48

我相信很多犹豫来自两件事:

  • 如果还没有破裂,请不要修复
  • [XYZ库]我们要求没有3.0端口

本文档概述了核心语言的行为方式,其中有很多差异。例如,将“打印”从一条语句更改为一个函数之类的简单操作将破坏大量的Python 2.x代码-这只是最简单的操作。他们在3.0中完全摆脱了较旧的类。实际上,它们是完全不同的语言-因此移植旧代码并不像某些人想象的那么简单。


2
依赖关系没有端口问题也是递归的。需要的是使用广泛的库,这些库在stdlib到port之外几乎没有依赖,甚至没有依赖,然后可以启动链式反应。
— 托尼·迈尔

10
我要换顺序。我们很多人都在走动,等待特定的软件包迁移到
— 3。– S.Lott

1
@Tony-这就是为什么我认为Numpy现在可用于3.0的福音。@ S.Lott-我想这真的取决于3是否提供您想要的东西。老实说,我最近才从2.5上升到2.7-因此,我并不是真正追随“最新,最伟大”的人之一。
— TZHX 2011年

1
但是,借助的移植旧代码2to3并不像某些人担心的那么难。
— ncoghlan 2011年

5
几乎所有将Python捆绑到发行版中的操作系统(OSX,Linux等)都仍然停留在某些古老版本的Python 2上,这无济于事。为什么当没人能使用您的代码而无所适从时,为什么要为Python 3编写代码呢?与他们的操作系统的内部?
— 蚂蚁

28

现有企业没有强迫理由花费时间,金钱和精力迁移到某样东西,而现有功能集却没有变化。我的意思是说基于Python 2系列的代码已经在企业中运行并运行了很长时间,其稳定,经过测试并具有所有当前产品功能集。为什么有人会花时间,金钱和精力只是为了迁移到Python 3而已。

除了迁移后,还要确保没有回归失败,而且所有头痛都是不可避免的。

对于新项目,该策略是简单明了的,它始于以下几点:

  1. 是否有任何发行版(如Ubuntu)在默认安装中附带Python 3?
  2. 什么是Python 3的库生态系统?
  3. 所有框架等都与Python 3等兼容吗?

它是您通常的“选择一种新语言”的过程。这就是出现鸡鸡蛋问题的地方,没有多少人在使用它,因为没有多少人在使用它。最终,没有人会感觉完全转向它。

打破向后兼容性从来都不是一件好事,在最后,您总是会吸引很多用户。


14

在Python 2.0发行之时,Python迅速普及。有许多新用户自然使用最新版本,因为他们不依赖旧版本。由于许多人默认采用2.0,因此库开发人员等面临很大压力。

到发布Python 3.0时,已经有大量的用户依赖Python 2.0,并且指数增长(相对于现有用户而言保持恒定的因素)显然无法无限持续。

就个人而言,Python 2天内的新功能似乎比Python 3所提供的功能更具吸引力。

我曾经以为Python 3最终会接管一切,但是现在我不确定。但是,不仅仅是这个问题存在于Python中。毕竟,有多少人诚实地使用Perl 6?这大约比Python 3 IIRC长一点。


3
地狱,我仍在使用Fortran77。:)并且Python 3的大多数真正的“功能”已被反向移植到2.6和2.7中,而没有太多的兼容性问题。Python 3 真正提供的唯一功能是“更清洁”的语法。
— TZHX 2011年

3
比较Python 3和Perl 6是错误的。Python 3是Python 2的增量跳跃,而Perl 6是彻底的重新设计。Perl 5和Perl 6是姐妹语言,并且将继续长期存在。另一方面,Python 3计划替换Python 2,而不仅仅是共存。这是一个很大的差异。
— 卡马勒尔2011年

1
Perl 6仍在开发中。是的,Rakudo Perl是最接近Perl 6规范的实现,但是还没有实现所有功能。根本没有生产就绪的Perl 6实现。
— 2011年

1
@Htbaa提供了完整性和就绪性的许多定义。Perl 6已完成并准备生产。事实是,要匹配完整的规范可能需要一段时间,其他语言也有类似的情况。例如,直到最近,GCC仍未真正与整个C ++规范完全匹配。语言设计和实施是一个非常缓慢的过程。
— kamaal 2011年

1
rakudo.org/node/75 Rakudo星被释放了很久。您需要尝试一下。
— kamaal 2011年

11

对我来说,最大的障碍是整数除法,我认为无法通过自动翻译解决。我有依靠x / 2的科学代码,将x舍入(当x为整数时)。

Python 3不会这么做,但是会给出.5答案(对于奇数x)。
我不能只用//替换代码中的所有/,因为有时我会进行浮点除法,因此希望进行浮点运算。

因此,要移植到python 3,我将不得不遍历数万行代码,检查每个/,并查看是否可以确定它应该是/或//。


7
该“-Q”选项(2.2〜2.7),可提高对部门的警告。另外,fixdiv.py使用这些警告来更新脚本中的表达式。
— Eryk Sun

10

如果您需要的所有库都已移植到Py3k,则 Python 3可以很好地启动一个新项目。

如果这不是一个选择,那么使用Python 2.7是两全其美的方法:您拥有为Python 2.x创建的每个库,并且可以逐渐将代码更改为与Py3k兼容,因此在您决定使用时易于迁移它。您在2.7中已经拥有的来自Py3k的语法好东西列表很长,只是不要忘记从中导入__future__。我的最爱默认情况下是Unicode,除法总是产生浮点数。


10

从Web服务的角度来看:主要服务器框架和Web框架都不支持Python3。

更新:显然,这是2011年初的情况,截至目前(2013年底),大多数主要框架都在使用Python3。但是,有些仍然不兼容。重要的例子是Twisted,它仍在进行中。


顺便说一句,Django在v 1.5中刚刚开始实验性地支持Python3。
— 9000

1
Django 1.6现在正式支持Python3。Flask也支持它。
— chhantyal

8

除非您从事繁重的i18n工作,否则我没有使用P3K的令人信服的理由。在我的尝试中,我发现普遍使用的Unicode成为我(ASCII)工作的障碍,也是强制生成器阻塞我的代码的障碍。

几年后,3将呈现出更加引人注目的环境,但今天不是。


4

发行版不使Python3可用。有一些附带发行版已经从Python2过渡了。但是主流的Linux变体(例如Debian,Ubuntu等)却没有。这就是我作为应用程序作者不执行任何操作的主要原因。

尽管我准备了过渡,甚至尝试避免不兼容的语法构造,但我无法对其进行适当的测试。真正归结为鸡肉和鸡蛋问题。


4
这可能曾经是真的,但是“ apt-get install python3”和“ yum install python3”都已经使用了很长时间了。Tox之类的工具和Shining Panda CI之类的服务使其可以跨多个Python版本进行测试。
— ncoghlan

现在,许多发行版默认情况下会安装python3,这与许多其他编程语言不同。
— Antti Haapala 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.