从 Python 2 迁移到 Python 3
Source: Dev.to
Python 2 在 2020 年 1 月已结束生命周期,但许多遗留项目仍在使用它。迁移到 Python 3 对于利用现代特性、更佳性能、安全更新和长期支持至关重要。然而,迁移过程并不总是轻而易举。下面列出主要挑战、实用策略以及代码示例,帮助实现平稳过渡。
1. 理解关键差异
-
print 现在是函数
# Python 2 print "Hello" # Python 3 print("Hello") -
整数除法行为
# Python 2 5 / 2 # → 2 (向下取整除) # Python 3 5 / 2 # → 2.5 # 使用 // 进行整数除法 5 // 2 # → 2 -
默认使用 Unicode 字符串
Python 3 的字符串是 Unicode(str),而 Python 2 区分str(字节)和unicode。 -
内置函数返回迭代器而非列表
range()、map()、filter()、zip()等函数现在返回迭代器。 -
异常语法
# Python 2 except Exception, e: ... # Python 3 except Exception as e: ...
2. 迁移前的准备
审计代码库
识别 Python 2 特有的语法、库和依赖。
检查依赖
确保所有第三方包都支持 Python 3。使用 pip list 并验证兼容性。
创建虚拟环境
创建一个 Python 3 虚拟环境,以在不影响现有环境的情况下进行迁移测试:
python3 -m venv py3env
source py3env/bin/activate
3. 使用自动化工具
2to3 工具
扫描代码并建议改为 Python 3 语法的修改。
2to3 -w myproject/
-w 表示就地写入更改。请仔细审查修改,尤其是复杂代码。
futurize / modernize
在增量迁移期间帮助代码兼容 Python 2 与 3 的库。
pip install future
futurize -w myproject/
4. 常见手动修复
字符串处理
# Python 2
s = u"Hello"
print type(s) #
# Python 3
s = "Hello"
print(type(s)) #
字典遍历
# Python 2
for key in mydict.iterkeys():
print(key)
# Python 3
for key in mydict.keys():
print(key)
处理 xrange
在 Python 3 中将 xrange() 替换为 range()。
5. 测试与验证
单元测试
在 Python 3 环境下运行现有测试,并逐一修复失败的测试。
CI/CD 流水线
在单独的分支或流水线中测试 Python 3 代码后再合并。
增量迁移
如果代码库庞大,可按模块逐步迁移。
6. 处理第三方库
某些库可能不兼容 Python 3。可选方案包括:
- 如有可用,升级到最新版本。
- 替换为现代替代品。
- 使用 six 等兼容层,在迁移期间同时支持 Python 2 与 3。
7. 迁移后最佳实践
-
使用 Python 3.10+,以获得 match‑case 语句、类型提示和性能提升。
-
删除 Python 2 兼容代码,降低复杂度。
-
采用 f‑strings 实现简洁的字符串格式化:
name = "Alice" age = 30 print(f"{name} is {age} years old")
结论
从 Python 2 迁移到 Python 3 可能看起来令人生畏,但只要做好规划、利用自动化工具并进行细致测试,就完全可行。关注代码质量、依赖兼容性以及全面测试,确保迁移过程顺畅。
关键要点
- 审计并准备代码库。
- 使用
2to3或futurize自动化语法更改。 - 大量测试并增量迁移。
- 充分利用 Python 3 特性,编写更简洁、安全、高效的代码。