Python 3于2008年12月发布。从那时起已经过去了很多时间,但是直到今天,许多开发人员仍在犹豫使用Python3。即使像Django这样的流行框架也与Python 3不兼容,但仍然依赖Python2。

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

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

评论

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

您可以引用其中的一些讨论/资料吗?

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

您没有看到Python 3耻辱墙吗?

@detly,现在称为Python 3 Superpower Wall

#1 楼

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

上一个答案更长的时间上,我的答案更长:

(状态更新,2012年9月)

我们(即Python核心开发人员)预测Python 3.0发行时,将3.x变成“默认值”大约需要5年。 “是2.x系列中新项目的选择。该预测是为什么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转换工具可以很轻松地处理它。 br << /> pra中最大的问题ctice实际上是一种语义:python 3不允许您像Python 2那样快速随意地使用文本编码。这既是它相对于Python 2的最大好处,也是移植的最大障碍:您必须修复Unicode处理问题才能使端口正常工作(而在2.x中,许多代码静默地生成了错误的数据,非ASCII输入,给人以工作的印象,特别是在非ASCII数据不常见的环境中。

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

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

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

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

用于管理迁移过程的工具也已显着改进。除了作为CPython的一部分提供的2to3工具(现在认为它最适合不需要维护对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库的支持状态产生过分负面的看法。

获取有关该级别信息的首选方法的P PyPI对ython 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的关键库和框架,还提供了一些infor关于开发人员如何在将关键项目移植到Python 3中从PSF寻求财务帮助的说明。

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

评论


根据过去18个月的进度进行了更新(并明确指出了3.1是第一个真正可行的生产3.x版本,因为3.0中的IO性能非常差)

– ncoghlan
2012年9月5日,下午3:15

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

– ncoghlan
13年10月30日在2:14

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

– Zetah
15年3月3日在13:07

我看到它的方式(为此,我会被一些人付之东流)是在编码方面,Py3在“实用主义超越了纯净度”这一点上违反了Py3(并且依旧如此) :Py3是纯编码的。 Py2编码实用。

–于尔根·艾哈德(JürgenA. Erhard)
15年11月25日在22:13

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

– ncoghlan
2015年12月9日7:45



#2 楼

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


如果它没有损坏,请不要修复
[XYZ库]我们不需要具有3.0端口

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

评论


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

–托尼·迈尔(Tony Meyer)
2011年3月31日上午9:45

我要换顺序。我们中的许多人都在走动,等待特定的软件包迁移到3。

– S.Lott
2011年3月31日10:00

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

– TZHX
2011年3月31日晚上10:08

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

– ncoghlan
2011年3月31日12:56

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

–蚂蚁
2011年3月31日14:18

#3 楼

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

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

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


像Ubuntu这样的发行版在默认安装中是否都提供Python 3 ?
什么是Python 3的库生态系统?
所有框架都与Python 3兼容吗?
等等等?

您通常选择新语言的过程。这就是出现鸡鸡蛋问题的地方,没有多少人在使用它,因为没有多少人在使用它。最终,没有人会觉得完全不喜欢它。

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

#4 楼

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

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

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

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

评论


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

– TZHX
2011年3月31日9:00

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

– kamaal
2011年3月31日上午9:13

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

– Htbaa
2011年3月31日在9:14

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

– kamaal
2011年3月31日在9:22

rakudo.org/node/75 Rakudo星很早就被释放了。您需要尝试一下。

– kamaal
2011年3月31日上午10:03

#5 楼

对我来说,最重要的显示停止器是整数除法,我认为无法通过自动翻译解决。我有一些科学代码,它们依靠x / 2将x舍入(当x是整数时)。

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

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

评论


“ -Q”选项(2.2到2.7)可以发出划分警告。另外,fixdiv.py使用这些警告来更新脚本中的表达式。

–太阳神
2012年5月17日13:45

#6 楼

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

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

#7 楼

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

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

评论


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

– 9000
13年1月21日在8:31

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

–钱币
2013年11月9日19:30

#8 楼

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

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

#9 楼

发行版不使Python3可用。有一些附带发行版已经从Python2过渡了。但是主流的Linux变体(例如Debian,Ubuntu等)却没有。这是我作为应用程序作者不执行任何操作的主要原因。
尽管我准备了过渡,甚至尝试避免不兼容的语法构造,但我无法对其进行适当的测试。真正归结为鸡肉和鸡蛋问题。

评论


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

– ncoghlan
2012年11月29日下午6:47

现在,许多发行版默认情况下会安装python3,这与许多其他编程语言不同。

–安蒂·哈帕拉(Antti Haapala)
15年3月21日在6:24