VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python2 和 Python3 的区别及兼容技巧

前言

最近 Python 之父 Guido van Rossum(龟爷)终于在 Python 官方邮件组落实了 Python 2.7 的终焉之日(EOL)。

说的是 Python 2.7 的 EOL 日期最终确定为 2020 年 1 月 1 日,之后不会有任何更新,包括源码的安全补丁。

所以兼容Python3已经可以说非常必要了,但有些常用的库还没有升级到Python3,所以我们看下如何写出兼容2和3的代码。

Python 2 or 3 ?

Python 3 被钦定为 Python 的未来,于 2008 年末发布,是目前正在开发的版本。旨在解决和修正 Python 2 遗留的设计缺陷、清理代码库冗余、追求有且仅有一种最佳实践方式来执行任务等问题。

 

起初,由于 Python 3 不能向后兼容的事实,导致了用户采用缓慢,对初学者不友好等问题。但在 Python 社区的努力和决绝态度下,截至龟爷发出邮件之前,已经有了 21903 个 Packages 可以支持 Python 3.5,其中包括了绝大多数最受欢迎的封装库,与此同时也有越来越多的封装库(e.g. Django、Numpy)表示其新版本将不再支持 Python 2。

 

Python 2.7 于 3.0 之后的 2010 年 7 月 3 日发布,计划作为 2.x 的最后一个版本。Python 2.7 的历史任务在于通过提供 2 和 3 之间的兼容性措施,使 Python 2.x 的用户更容易将代码移植到 Python 3.x 上。那么如果你希望自己的代码能够兼容两个不同的版本,首先你起码要让代码能够正常的运行在 Python 2.7 上。

 

注:下文使用 P2 表示 Python 2.7;使用 P3 表示 Python 3.x。

不同与兼容

__future__ 模块是我们首先需要了解的,该模块最主要的作用是支持在 P2 中导入那些在 P3 才生效的模块和函数。是一个非常优秀的兼容性工具库,在下文中给出的许多 兼容技巧 实例都依赖于它。

 

特性 在此版本可选 在此版本内置 效果

nested_scopes 2.1.0b1 2.2 PEP 227:静态嵌套作用域

generators 2.2.0a1 2.3 PEP 255:简单生成器

division 2.2.0a2 3.0 PEP 238:除法操作符改动

absolute_import 2.5.0a1 3.0 PEP 328:Imports 多行导入与绝对相对路径

with_statement 2.5.0a1 2.6 PEP 343:with 语句

print_function 2.6.0a2 3.0 PEP 3105:print 语句升级为函数

unicode_literals 2.6.0a2 3.0 PEP 3112:Bytes 类型

(__future__ 功能列表)

 

统一不等于语法

P2 支持使用 <> 和 != 表示不等于。

P3 仅支持使用 != 表示不等于。

兼容技巧:

统一使用 != 语法

 

统一整数类型

P2 中整数类型可以细分为短整型 int 和长整型 long。

P3 废除了短整型,并统一使用 int 表示长整型(不再有 L 跟在 repr 后面)。

兼容技巧:

1
2
3
4
# Python 2 only
= 9223372036854775808L
# Python 2 and 3:
= 9223372036854775808
1
2
3
4
5
# Python 2 only
bigint = 1L
# Python 2 and 3
from future.builtins import int
bigint = int(1)

统一整数除法

P2 的除法 / 符号实际上具有两个功能:

当两个操作数均为整型对象时,进行的是地板除(截除小数部分),返回整型对象;

当两个操作数存在至少一个浮点型对象时,进行的是真除(保留小数部分),返回浮点型对象。

P3 的除法 / 符号仅仅具有真除的功能,而地板除的功能则交由 // 来完成。

兼容技巧:

1
2
3
4
5
# Python 2 only:
assert 2 / 3 == 0
# Python 2 and 3:
assert 2 // 3 == 0
True division” (float division):
1
2
3
4
# Python 3 only:
assert 3 / 2 == 1.5
# Python 2 and 3:
from __future__ import division    # (at top of module)

统一缩进语法

P2 可以混合使用 tab 和 space 两种方式来进行缩进(1 个 tab == 8 个 space),但实际上这一特性并非所有 IDE 都能够支持,会因此出现同样的代码无法跨 IDE 运行的情况。

P3 统一使用 tab 作为缩进,如果 tab 和 space 同时存在,就会触发异常:

1
TabError: inconsistent use of tabs and spaces in indentation.

相关教程