迁移至Python3

用过Python的都知道,他有两个互不兼容的大版本Python2和Python3,由于历史遗留问题许多生产环境或库还只支持老版本Python2.

实际上2.7已经发布了近8年,且是最后一个2.x的大版本,并且将于2010(两年后)彻底停止维护,退出历史舞台.

Python3在两年前及更早时的库支持和应用范围确实不太好,有选择困难症的同学都转去Go语言了:) .

幸运的是近两年主流库/框架都已支持Python3,毕竟发布已经10年多了,在新项目中毫无疑问必须用Python3.

之前我在两个新项目已经使用Python3,最近把一个老项目也彻底迁移过来, 这里记录下一些知识点.

string和unicode

Python 2 的 str 是 bytes, Python 3 的 str 是 unicode.

# 字符串和二进制转换
unicode_string.encode()  # 默认utf-8
byte_string.decode()

# split现在是bytes的方法
# requests.get(xxx).content返回bytes类型
your_content.split(b',')

# base64编码后返回字节类型,转换为str
base64.b64encode(some_bytes).decode()

语法变化

  • 使用print()
  • except语句

有用的技巧

使用命令行参数提示兼容性问题:

  • python2 -3参数 提示warning
  • python3 -bb参数 提示字符串处理差异
# 判断当前运行版本
PY3 = sys.version_info[0] == 3
# 安装pip3
python3 -m ensurepip
# 或者
sudo apt install python3-pip

兼容2和3

除非迫不得已,应该只支持Python3

如果要兼容参考:

扩展阅读

代码片段

# 对称加密移除padding的帮助函数(py2版本不适用于py3)
def unpad(bytestring, k=16):
    """
    Remove the PKCS#7 padding from a text bytestring.
    """
    val = bytestring[-1]
    if val > k:
        raise ValueError('Input is not padded or padding is corrupt')
    l = len(bytestring) - val
    return bytestring[:l]


def pad(bytestring, k=16):
    """
    Pad an input bytestring according to PKCS#7
    """
    l = len(bytestring)
    val = k - (l % k)
    return bytestring + bytearray([val] * val)

Python3 的一些变更

  • time.clock(): 从3.3被弃用,3.8彻底不支持。用time.perf_counter() 或 time.process_time()替代