从 Python 2 迁移到 Python 3

发布: (2025年12月10日 GMT+8 00:44)
4 min read
原文: Dev.to

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 可能看起来令人生畏,但只要做好规划、利用自动化工具并进行细致测试,就完全可行。关注代码质量、依赖兼容性以及全面测试,确保迁移过程顺畅。

关键要点

  • 审计并准备代码库。
  • 使用 2to3futurize 自动化语法更改。
  • 大量测试并增量迁移。
  • 充分利用 Python 3 特性,编写更简洁、安全、高效的代码。
Back to Blog

相关文章

阅读更多 »

Python的秘密生活:导入系统

Python 如何找到你的代码以及它为何有时会丢失 Timothy 懒散地坐在椅子上,盯着他的终端,带着一种筋疲力尽的挫败感,像是……