为什么人们会犹豫使用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.buildoutpip并且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.