Python 版本
目前 Python 主要活跃的有 Python 2.x 和 Python 3.x 两个大版本,与 C++ 和 Java 这种向后兼容的语言不同,Python 的两个版本互不兼容。舍弃兼容性是一种设计上的取舍,在我看来 Python 这种尤为注重“简约”的语言,敢于大胆摒弃一些有设计缺陷的旧包袱,从而拥抱新特性的作风,未尝不是一种 Pythonic 的体现,很大程度上避免了走向像 C++ 一样越来越臃肿晦涩的道路。
Python 核心团队已于 2019 年正式宣布将在 2020 年停止对 Python2 的更新,在此期间会对 Python2 版本进行一些 bug 修复、安全增强以及移植等工作,以便使开发者顺利的从 Python2 迁移到 Python3。Python 2.7 是 2.x 系列的最后一个版本,官网上最新的 Python 2.7.18 版本发布于 2020 年 4 月 20 日。官方停止 Python2 更新的主要动机是想进行 Python3 的推广,以及同时维护两个版本给他们带来的工作负担。目前大部分 Python 开源项目已经兼容 Python3 了,所以强烈建议使用 Python3 来开发新的项目。
一般较新的 Linux 发行版已经预装了 Python2 和 Python3,如果没有,也可以通过各自的包管理器进行安装和更新。Mac OS 环境下可以通过 Homebrew 工具来安装 Python,可以附加 @ + 版本号
安装指定版本。在一般情况下(不手动修改软链接),命令行中的 python
通常是 python 2.7 或其旧版本的别名,python3
才指代 Python3 版本,可以通过 --version
参数来查看安装的具体版本。由于两个版本互不兼容,在命令行运行 Python 脚本前需要先确定其所用的 Python 版本。
1 | ➜ brew install python # brew install python@2.7 |
有时也需要在代码中,也就是运行时确定 Python 版本,此时用到的是内置的 sys 模块:
1 | import sys |
可以通过在运行时判断 Python 版本从而达到较好的兼容性,这在 Python 的内置模块以及标准库中使用较多。由于 version_info
本身是个 tuple 类型,重载了比较运算符,所以可以像下面这样直接进行比较:
1 | # builtins.pyi |
上面的源码来自于两个不同的文件,阅读源码可以发现一些 Python 版本变更的内容。比如自 Python 3.9 引入的 GenericAlias 类型;Python 3.4 之前继承抽象类时还得使用 ABCMeta 形式。