【Python3和Python2为什么兼容性很差?】

摘要

Python3和Python2,因为某些特殊的原因,是兼容性非常低的一次大的版本升级。作为新人你必须要知道,绝大多数Python2的代码,没法在Python3的环境里运行!反之亦然。那既然有了Python3,为什么还要有Python3?特别是为什么我们选择进行整个向后不兼容的unicode/str/bytes因为这是将代码移植到 Python 3 中真正棘手的部分。

Python 2 中的文本和二进制数据是一团糟

以下代码在语义上代表什么?

'abcd'

如果您是 Python 3 用户,您会说它是按顺序由字母“a”、“b”、“c”和“d”组成的字符串。

如果您是 Python 2 用户,您可能会说同样的话。你可能也说过它是代表 97、98、99 和 100 的字节。事实上,Python 2 中有两个正确的答案来说明str
对象所代表的含义,这导致语言发生了变化,因此单个 Python 3 的答案是唯一的答案。

Zen说“应该有一种------最好只有一种-------明显的方式来做到这一点”。在可以表示文本数据或二进制数据的语言中使用文字是一个问题。例如,如果您从网络读取某些内容,则必须非常小心地说str返回的对象表示二进制数据或文本数据,因为一旦对象离开您的控制,就无法知道。或者,您的代码中可能存在错误,您本应将该str对象转换为文本数据(或完全是其他内容),但您搞错了,不小心跳过了该步骤。由于str对象可能代表两种不同的语义类型,因此很难注意到这种错误何时发生。

现在您可能会尝试争辩说,如果您避免使用文本数据类型str而是依赖文本类型unicode,那么这些问题在 Python 2 中都是可以解决的。虽然这完全正确,但人们在实践中不会这样做。要么人们变得懒惰并且不想打扰解码为 Unicode,因为它是额外的工作,要么人们变得渴望性能并试图避免解码成本。无论哪种方式,它都假设您将编码得足够好,不会搞砸,而且我们都知道我们是容易犯错的人,实际上并不完美。如果人们在 Python 2 中编写无错误代码的希望真的实现了,那么我不会。

避免错误的这一点是人们忘记的大事。语言的简化和str对象可能表示的隐含性的消除使代码不易出错。Zen指出“显式胜于隐式”是有原因的:二义性和隐式知识不易沟通,代码容易出错,导致bug。通过强制开发人员明确地将他们的二进制数据和文本数据分开,它可以生成更好的代码,而这些代码出现某一类错误的机会更少。

世界其他地方已经全力以赴 Unicode(有充分的理由)

人们有时会忘记 Python 有多古老;Guido 于 1989 年 12 月开始编写 Python,并于 1991 年 2 月首次作为开源发布。这意味着 Python 本身早于1991 年 10 月发布的第一卷 Unicode 标准。在随后的几年中,在 Unicode 标准化之后创建的语言选择将其字符串实现基于可以支持 Unicode 的编码。这使 Python 2 处于不幸的境地,它在 2004 年(当 Python 3 计划开始时)获得了显着的牵引力,但它对 Unicode 文本的支持可以说是最弱的,因为该unicode类型是完全可选的并且人们没有使用它对于所有文本数据。

支持任何书面语言的 Unicode 和文本很重要。Python 是一种面向世界的语言,而不仅仅是那些支持 ASCII 涵盖的罗马字母的语言。这就是为什么 Python 3 在文本方面使它成为“Unicode or bust”的原因。它保证所有 Python 3 代码都将支持世界上的每个人,无论编写代码的开发人员是否明确表示要这样做。unicode在 Python 2 中,花时间正确支持文本数据类型的项目与不支持文本数据类型的项目之间存在分歧。在 Python 3 中没有这样的分裂,并且支持所有语言都是免费的。

我们认为 Python 会越来越流行

2004 年,我们启动了PEP 3100并因此开始设计 Python 3(顺便说一句:PEP 最初编号为 3000,但我们将其重新编号为 3100,以便编号为 3000 的PEP将是我们如何处理 Python 3 开发的 PEP)。我们知道 Python 的受欢迎程度呈上升趋势,我们希望它会继续增长。但这也意味着,如果我们要修复任何设计错误并帮助该语言继续流行,我们需要现在而不是以后做。我们假设在足够长的时间框架内,用 Python 3 编写的代码比用 Python 2 编写的代码更多,假设我们没有搞砸 Python 3,因为它比 Python 2 持续时间更长,并且在 Python 2.7 仅用于遗留时使用得更多项目而不是新项目。所以我们决定承受 Python 2/3 过渡的痛苦,并在这个假设下创建了 Python 3。显然,就代码行数而言,世界上的 Python 3 代码是否超过 Python 2 代码需要几十年的时间。

我们永远不会再做这种向后不兼容的改变

作为一个团队,我们已经决定,像unicode/str/bytes这样大的变化永远不会再如此突然地发生。当我们开始 Python 3 时,我们认为/希望社区会像 Python 所做的那样做最后一个支持 Python 2 的功能发布,然后切换到 Python 3 开发以进行功能开发,同时仅针对 Python 2 版本进行错误修复发布。这显然没有发生,我们已经吸取了教训。另外,我们没有看到语言的基本设计有任何缺点,可以保证需要做出如此重大的改变。因此,期望 Python 4 不会做任何比从标准库中删除可能已弃用的模块更激烈的事情。

结论

所以这就是为什么要有Python3 的原因。我们意识到,由于在 Python 2 中过度使用str类型,人们一直存在一系列错误,因此我们在 Python 3 中通过明确区分文本数据和二进制数据来修复这些错误。它还有助于通过使所有文本数据自动支持 Unicode,项目突然变得更容易使用多种语言。当我们这样做时,我们做出了改变,因为我们认为越早越好。我们构建了过渡,认为社区会与我们一起将 Python 2 抛在后面,但事实证明并非如此,相反,我们花了更多时间并使用 Python 2/3 兼容的语言子集来管理过渡。

摘自: 高大、狡猾的加拿大人的文章.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python版本兼容性并不差,相比其他编程语言,Python的版本兼容性反而相当好。然而,Python版本兼容性可能会有一些问题,主要是因为以下几个原因: 1. Python存在2.x和3.x两个主要版本:Python 2.x和Python 3.x是不兼容的两个版本,其中Python 3.x是对Python 2.x的一次重要升级。由于语法和库的差异,直接将2.x的代码迁移到3.x会有一些兼容性问题。 2. 依赖的第三方库不同版本支持:在Python中,使用第三方库非常常见,而不同版本的第三方库可能会对不同的Python版本支持有所差异。一些Python库可能只支持特定版本,如果在不同版本的Python上使用,就会出现兼容性问题。 3. 语言特性和变动:每个Python版本都会引入新的语言特性和变动,这些变动可能会影响现有的代码。如果使用较新版本的Python编写的代码,在旧版本的Python上运行可能会出现兼容性问题。 为了解决Python版本兼容性问题,我们可以采取以下几个方法: 1. 使用兼容的第三方库版本:在使用第三方库时,选择适用于目标Python版本的相应库版本,以确保兼容性。 2. 使用工具进行代码转换:对于Python 2.x代码迁移到Python 3.x,可以使用一些自动转换工具,如2to3等,来帮助自动转换代码。 3. 编写兼容性代码:在编写Python代码时,可以采用一些兼容性写法,以确保在不同版本的Python上能够正常运行,并尽量避免使用过时的特性和库。 总的来说,Python版本兼容性并不差,只要在使用过程中注意选择合适的第三方库版本和进行一些兼容性处理,就可以较好地解决兼容性问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值