Python 2.x 旧代码迁移:明确除法与文本编码边界
用一个学习进度与中文导出案例梳理 Python 2 到 Python 3 的关键行为差异,并运行迁移后的实现验证比例与 UTF-8 字节数。
本节目标
用一个学习进度与中文导出案例梳理 Python 2 到 Python 3 的关键行为差异,并运行迁移后的实现验证比例与 UTF-8 字节数。
环境与运行方法
本篇面向维护旧项目,实际可运行示例使用 Python 3.12 及以上。保存为 lesson.py,执行 python3 lesson.py。不要求安装已停止维护的 Python 2,也不把旧解释器用于新项目。
核心思路
旧代码迁移不能只修改 print 的括号。整数除法、str 与字节数据、异常和第三方依赖都可能改变程序行为。先写出业务预期,再在目标解释器下验证,能避免“语法通过但结果已变”的迁移。
完整示例
completed, total = 3, 8
if total <= 0:
raise ValueError("total must be positive")
ratio = completed / total
title = "学习Python"
payload = title.encode("utf-8")
restored = payload.decode("utf-8")
print(f"progress={ratio:.1%}")
print(f"text={len(title)} bytes={len(payload)}")
print(restored == title)预期输出
progress=37.5%
text=8 bytes=12
True逐步理解
Python 3 的 / 得到普通除法结果,// 表达向下取整。如果旧代码依赖整数除法,迁移时必须判断应保留取整还是修复为比例。不能把所有除号一律替换。
Python 3 文本与字节分开,文件或网络边界显式 encode、decode。两个汉字与六个 ASCII 字母共八个码点,UTF-8 共十二字节。长度差异是编码表示问题,不是字符丢失。迁移后的完整项目还要验证依赖版本、I/O 和错误路径。
常见问题与边界
- 自动改写工具不能证明业务语义一致。
- bytes 与 str 不能靠随意 str() 转换完成解码。
- 本例只验证展示与编码,不代表整套旧系统已经可迁移。
动手练习
把完成量改成 5,标题改成 Python入门,再预测输出。
参考答案
进度 62.5%,码点数仍为 8,UTF-8 字节数仍为 12,往返比较为 True。为旧项目增加这样的行为测试,再逐模块迁移,比只看能否启动更可靠。
文章回复
0 条公开回复