『Python』为什么迁移至 Python 3 这么难?( 二 )


由于修复这些问题可能会破坏现有代码 , 而几乎所有为 2.0 编写的代码仍可在 2.7 上运行 , Python 3 应运而生 。
『Python』为什么迁移至 Python 3 这么难?
本文插图
设计之初 , Python 3 的预期是用户会直接转移到新版本 , 从而放弃使用 Python 2。 然而在一开始 , 人们有很多理由不采用 Python 3:最主要的原因是 , 它并没有与 Python 2 兼容 。 同时 , 大多数的库希望同时在 Python 2 和 Python 3 上运行 , 这在一开始很难运作 , 并且由于缺乏支持工具 , 移植代码的工作十分艰难 。
转折点发生在大约 2016 年左右的 Python 3.5 发行版中, 该版本增加了矩阵乘法、引入了 asyncio、对 OrderedDict 的速度进行了提升以及实现了类型提示 , 这些提示为 Python 带来了一些类似于静态语言的功能 。
更高版本包含更多功能 , 例如 Pathlib 库和 f 字符串操作 。通过这些更改 , 人们使用的许多库(例如用于机器学习的 scikit-learn )开始向 Python 3 迁移 。
除了 Python 3 本身存在的一些技术问题 , 用户不愿意迁移的主要原因还有这样几点:
安全问题 。具有讽刺意味的是 , 用户会认为不进行升级会带来更大的风险 , 但是在大型组织或机构中 , 不允许员工自己升级 Python:管理员或安全团队会向他们推送更新 。在某些情况下 , 也不允许下载 PIP 。如果 Python 2 是安全团队同意的默认设置 , 那么它可能需要做出巨大的努力才能说服人们将其切换到 3 , 尤其是在受到严格监管(例如医疗保健或金融)和政府的环境中 。
使用惯性 。尽管许多版本的 Linux 中(例如 RHEL) , 都同时兼容 Python 2 与 Python 3 , 但这不是默认的选项 , 因此用户在 2 和 3 之间切换时 , 经常发现一些错误 , 尤其是指向系统版本的指针 , 例如 , 在 Debian 上使用 Python 。
如何避免迁移出现问题? 如何迁移到 Python 3?每家公司的做法可能有所不同 , 所以在此之前 , 不如先看看官方给出的建议 。
Python 软件基金会已经为需要同时运行 Python 2 和 3 的组织提供了如何实现跨代兼容性的综合指南 , 以下是其建议的摘要:
1. 放弃对 Python 2.6 和更早版本的支持 , 因为从 Python 2.7 迁移要容易得多 , 并且如果必须运行 Python 2.6 , 请考虑使用 six library 来与 Python 3 兼容 。
2. 确保 setup.py 文件正确指定了代码库支持的 Python 版本 , 并且该文件至少包括 Programming Language :: Python :: 2 :: 仅作为 trove 分类器 。
3. 测试套件应至少具有 80%的代码覆盖率 , 即在测试过程中执行多少源代码的名称 。 如果不了解代码覆盖率 , 请使用 coverage.py 提供的工具 。
4. 阅读 Python 的“新增功能”文档和免费的“ 移植到 Python 3”手册 , 了解 Python 2 和 Python 3 之间的区别 。
5. 使用 Futurize 或 Modernize 使 Python 2 代码与 Python 3 兼容 , 请确保阅读文档 , 以便解决这些无法处理的问题 。
6. 确保适应在 Python 2 和 3 之间处理整数除法的更改 。 例如 , 在 Python 2 中 9/2 = 4 , 而在 Python 3 中 9/2 = 4.5 。 如果可以在代码中使用“future import”除法和“//”运算符进行整数除法 , 那么代码已经与 Python 3 兼容 。
7.Python 3 更改了可以与 str 类型一起使用的数据 , 以使文本和二进制数据之间的区别更加清晰 。 不幸的是 , 对于同时处理文本和二进制数据的代码 , 必须执行以下步骤以确保代码符合要求: https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data
8. 当运行的代码因运行的版本不同而表现不同时 , 最好检查 Python 3 支持的特定功能是否能够运行 , 而不是检查 sys.version_info [0] 是否等于 3 。


推荐阅读