Python2和Python3的兼容问题

在看社区里面开源的深度学习或者python项目时, 经常会看到诸如__future__或者six.moves 这种名字很奇怪的包, 实际上, 这些包都是为了实现python2与python3的兼容性而设置的, 在python社区里, 很多公司或者个人为了只维护一套代码, 一般都会写同时兼容Python2/3的代码.

future

python3 出来的时候, python的设计者们当然也考虑过代码之间的兼容问题, 许多为兼容性设计的功能可以通过 __future__ 这个包来导入, 较常用的例如:

1
2
3
4
5
6
7
8
9
10
11
from __future__ import print_function
# 让python2可以使用python3的print函数, 同时禁用python2的print语句

from __future__ import unicode_literal
# 像python3一样, 字符串字面量的类型为文本( 文本是python2中的unicode, python中的str), 而不是字节( python2中的str, python3中的bytes)

from __future__ import absolute_import
#

from __future__ import division
# 让python2像python3一样, int/int = float, int // int = int

上面四条语句导入以后, python2中的很多语法就和python3差不多了

six

由于 python2/3 之间还有很多别的差异, 因此只用 __future__ 是不够的. 用 six 这个 第三方模块 可以解决这个问题.

例如, Python2 和 Python3 中字符串类型名字不同, six可以把它们变成统一的第三种形式: six.text_type , six.binary_type